wordpress數(shù)據(jù)庫導(dǎo)出網(wǎng)址鏈接關(guān)鍵詞推廣優(yōu)化外包
一、實(shí)驗(yàn)簡介
傳統(tǒng)的計(jì)數(shù)方法常依賴于人眼目視計(jì)數(shù),不僅計(jì)數(shù)效率低,且容易計(jì)數(shù)錯誤。通?,F(xiàn)實(shí)中的對象不會完美地分開,需要通過進(jìn)一步的圖像處理將對象分開并計(jì)數(shù)。本實(shí)驗(yàn)鞏固對OpenCV的基礎(chǔ)操作的使用,適當(dāng)?shù)脑黾覱penCV在圖像處理方向的進(jìn)階操作,例如利用canny算子等算法進(jìn)行圖像分割
二、實(shí)驗(yàn)?zāi)康?/strong>
通過本實(shí)驗(yàn)?zāi)軌蚓C合利用OpenCV在圖像處理的方向的應(yīng)用,了解并使用
OpenCV的基本操作,了解大概運(yùn)行邏輯和原理。
三、實(shí)驗(yàn)步驟與結(jié)果
1、實(shí)驗(yàn)實(shí)現(xiàn)功能說明
????通過本實(shí)驗(yàn)?zāi)軌蚓C合利用opencv在圖像處理的方向的應(yīng)用,能夠識別圖片中硬幣數(shù)量。
2、實(shí)驗(yàn)整體設(shè)計(jì)思路
1、選取圖片:可以選取硬幣擺放簡單的圖片,邊緣清晰也無交叉疊加;可以選取硬幣疊加的圖片,增加分割難度;可以選取一張包含不同物體的圖片且物體之間邊緣并不十分清晰,將指定物品的數(shù)量顯示出來
2、圖片讀取與展示
3、轉(zhuǎn)成灰度圖并進(jìn)行二值化
4、去掉背景
5、利用距離變換通過閾值讓圖像粘連分開或者采用腐蝕膨脹方法來,或者圖像分割(包括canny邊緣檢測等算法)將物體分割。
6、若采用距離變換方法或者腐蝕膨脹方法,需統(tǒng)計(jì)物體的輪廓,若直接采用圖像分割方法則省略這一步。
7、獲得零件數(shù)量。
8、繪制輪廓。(可以用不同的顏色為物體做一個區(qū)分)
3、實(shí)驗(yàn)程序
#導(dǎo)入庫
import cv2
import enum
import ipywidgets.widgets as widgets
import numpy as np
import matplotlib.pyplot as plt
import random
from IPython.core.display_functions import display
from cv2 import putText
#顯示文件圖像
# 1 文件的讀取 2 封裝格式解析 3 數(shù)據(jù)解碼 4 數(shù)據(jù)加載
img = cv2.imread('coins.jpg', 1)
# cv2.imshow('image', img) ?#這段需要在樹莓派圖形化界面命令行執(zhí)行,會顯示一個圖像的窗口
cv2.imwrite('coins.jpg', img) # 1 name 2 data
# 展示圖像的函數(shù)
def show(img, title=None):
????if title:
????????plt.title(title)
????try:
????????plt.imshow(img[:, :, ::-1])
????except Exception as e:
????????plt.imshow(img, cmap="gray")
????finally:
????????plt.show()
#高斯濾波,減小噪點(diǎn)和硬幣上的圖案對輪廓識別的影響
blurred = cv2.GaussianBlur(img, (15, 15), 0)
show(blurred, '231_lwx&wpb_After Gaussian filtering')
#轉(zhuǎn)化為灰度圖
img_gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)
show(img_gray, '231_lwx&wpb_Gray Image')
img_gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)
# 統(tǒng)計(jì)各個灰度級的個數(shù)
gray_histogram = cv2.calcHist([img_gray], [0], None, [256], [0, 256])
# 繪制灰度直方圖
plt.plot(gray_histogram, color='red')
plt.title("231_lwx&wpb_Grayscale Histogram")
plt.xlabel("Gray Level")
plt.ylabel("Count")
plt.xlim([0, 256])
plt.show()
# 算法自動找出合適閾值ret2,將灰度圖轉(zhuǎn)換為黑白圖,thresh為返回的黑白圖
ret2, thresh = cv2.threshold(img_gray, 0, 255, cv2.THRESH_OTSU+cv2.THRESH_BINARY)
show(thresh,'231_lwx&wpb_gray')
#另一種腐蝕膨脹
img_bgr2rgb1 = thresh
plt.imshow(img_bgr2rgb1)
plt.show()
# 開運(yùn)算:先腐蝕,再膨脹,消除圖片背景的噪聲
kernel = np.ones((3,3), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=3)
show(opening,'231_lwx&wpb_Open Operation')
result=opening
#畫出輪廓
contours,hirearchy=cv2.findContours(result,cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)# 找出連通域
img1=img.copy()
img1 = cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
show(img1, '231_lwx&wpb_Box the result')
ObjCount = len(contours)
# 在每個輪廓的中心標(biāo)注輪廓的標(biāo)號
for i in range(0, ObjCount):
????# minAreaRect返回輪廓的最小外接矩形的信息
????rect = cv2.minAreaRect(contours[i])
????img1 = cv2.drawContours(img, contours, i, (0, 0, 255), 2)
????# 在繪制輪廓前生成隨機(jī)顏色
????random_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
????img1 = cv2.drawContours(img, contours, i, random_color, 2)
????img2 = putText(img, str(i + 1), (int(rect[0][0]), int(rect[0][1])), cv2.FONT_HERSHEY_COMPLEX, 1, random_color, 2)
????# 在圖片上標(biāo)注硬幣的個數(shù)
img3 = putText(img, 'ObjCount=' + str(ObjCount), (20, 30), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 0, 0), 2)
# 署名
cv2.putText(img, "lvwenxiang", (0, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)
cv2.putText(img, "wangpengbo", (0, 90), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)
# 所有操作結(jié)束后進(jìn)行釋放
show(img1)
?
print(f"The Count of Corn is {ObjCount}")
4、實(shí)驗(yàn)結(jié)果
1.高斯模糊處理&二值化,灰度圖
?
2.灰度直方圖&灰度圖轉(zhuǎn)黑白圖
3.兩種腐蝕膨脹方法,類似
4.描繪邊界,統(tǒng)計(jì)數(shù)量
5.終端顯示
四、實(shí)驗(yàn)分析
1、實(shí)驗(yàn)總結(jié)與收獲
實(shí)驗(yàn)未達(dá)到理想結(jié)果,理想的結(jié)果是任意給出一張圖片,能識別出圖中硬幣數(shù)量。分析原因:一,與統(tǒng)計(jì)數(shù)量原理有關(guān),當(dāng)圖片背景和硬幣的顏色,飽和度等視覺感應(yīng)相似時(shí),python處理的機(jī)械化往往會造成誤差。二,在轉(zhuǎn)灰度圖時(shí)無法分割硬幣,即使在腐蝕膨脹后也無法分割硬幣,與硬幣反光也有一定關(guān)系。
實(shí)驗(yàn)結(jié)果可以實(shí)現(xiàn),讓我們了解了圖片物體統(tǒng)計(jì)的基本原理,本次綜合實(shí)驗(yàn)基于前面對OpenCV基礎(chǔ)編程的了解,打下堅(jiān)實(shí)基礎(chǔ)后,才可熟練完成本次任務(wù)。實(shí)驗(yàn)中需要選擇和調(diào)試不同的參數(shù),如閾值、腐蝕和膨脹的迭代次數(shù)等,這些參數(shù)的選擇對最終的圖像處理效果有很大的影響。我們學(xué)會了通過不斷嘗試和調(diào)整參數(shù)來找到最佳的處理結(jié)果,這也突顯了參數(shù)選擇的挑戰(zhàn)性和重要性。在進(jìn)行圖像處理實(shí)驗(yàn)時(shí),記錄和追蹤每個處理步驟和參數(shù)設(shè)置是非常重要的,添加必要的備注有助于增強(qiáng)代碼可讀性,這可以確保實(shí)驗(yàn)結(jié)果的可重復(fù)性,也方便了解和修復(fù)潛在的問題。
2、實(shí)驗(yàn)收獲
本次實(shí)驗(yàn)的進(jìn)行使我們對計(jì)算機(jī)視覺領(lǐng)域有了初步的認(rèn)識,讓我們能夠?qū)penCV這方面的知識有一個比較基礎(chǔ)的了解,對我們學(xué)習(xí)Python方面有非常棒的提高,使我對圖像處理和其他種種技術(shù)有了較為堅(jiān)實(shí)的基礎(chǔ)。
同時(shí)這次實(shí)驗(yàn)也提高了尋找問題和解決問題能力,鍛煉了我的思考能力,強(qiáng)化了我的思維方式,這對我今后的學(xué)習(xí)和生活都有很大的幫助。
3、其他(實(shí)驗(yàn)建議或意見)
提供腐蝕膨脹的代碼以及,給出更多的解決策略供新手學(xué)習(xí)參考,可給出網(wǎng)址,讓我們對識別統(tǒng)計(jì)的原理有更深的了解,發(fā)現(xiàn)更多解決問題方法。