一 圖像閾值處理
准備一張灰度圖像
閾值處理通常是設定一個閾值,讓圖片的所有像素點的值與其比較做出一系列的操作。
在opencv常用的閾值處理函數有五種,分別是THRESH_BINARY、THRESH_BINARY_INV、THRESH_TRUNC、THRESH_TOZERO、THRESH_TOZERO_INV。接下來分別看下這幾種處理圖片后的效果
1. THRESH_BINAR

# 像素值超過127的變成255,否則為0,亮的更亮
ret,threshold1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
2. THRESH_BINARY_INV
![]()
# 像素值超過127的變成0,否則為255,亮的更暗
ret,threshold2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
3. THRESH_TRUNC

# 像素值超過127的變成127,否則不變,理解成圖片整體變暗 ret,threshold3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
4. THRESH_TOZERO

# 像素值超過127的不變,否則為0,理解成加大圖片的對比度 ret,threshold4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
5. THRESH_TOZERO_INV

# 像素值超過127的為0,否則不變 ret,threshold5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
閾值處理的使用場景我會在后續的博客中寫出~~~
二 . 濾波
濾波的原理是通過指定大小的單位矩陣與圖像做相關運算,具體的線性代數的東西這里不展開,若后續工作會深入,再回來完善...
經常使用到的濾波操作有三種,均值濾波、高斯濾波、中位值濾波。
1.均值濾波(通過求與單位矩陣做內積和的平均值做圖像處理)

blur = cv2.blur(img,(3,3))
2. 高斯濾波 (根據正態分布處理圖像,越靠近中心點,值越接近)

blur2 = cv2.GaussianBlur(img,(3,3),1)
3. 中位值濾波(取指定大小矩陣的所有元素值的中位值處理)

blur3 = cv2.medianBlur(img,5)
把這幾張圖片水平拼接觀察,不難發現在處理噪點的場景中,使用中位值濾波效果最為明顯
三. 腐蝕與膨脹
1. 腐蝕

img = cv2.imread("test.png") img2 = cv2.erode(img,kernel=numpy.ones((9,9),numpy.uint8),iterations=9) 和單位矩陣做處理,迭代9次,意味這腐蝕的程度 cv2.imshow("IMage",numpy.hstack((img,img2))) cv2.waitKey(0) cv2.destroyAllWindows()
2. 膨脹 (嗯,和腐蝕操作剛好相反)

img2 = cv2.dilate(img,kernel=numpy.ones((9,9),numpy.uint8),iterations=9) cv2.imshow("IMage",numpy.hstack((img,img2))) cv2.waitKey(0) cv2.destroyAllWindows()
3. 梯度運算(膨脹-腐蝕)

4. 禮帽與黑帽

img2 = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel=numpy.ones((5,5),numpy.uint8)) # 就是腐蝕掉的部分
img3 = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel=numpy.ones((5,5),numpy.uint8)) # 原始部分的外殼
四. 圖像梯度與邊緣檢測
1.Sobel算子
這里的圖片借鑒自https://blog.csdn.net/JimmyFu0055/article/details/83718901
Gx,Gy分別代表水平與豎直方向上的梯度
原圖:
img = cv2.imread("test.png") sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3) # 1,0代表求水平dx方向上的梯度 sobelx = cv2.convertScaleAbs(sobelx) sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3) # 0,1代表求水平dy方向上的梯度 sobely = cv2.convertScaleAbs(sobely) sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0) sobelxy2 = cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3) # 不推薦這一種方法求邊界 cv2.imshow("IMage",sobelxy) cv2.waitKey(0) cv2.destroyAllWindows()
結果:
結語:這段時間工作實在太忙了,不是評論提醒都快忘記繼續寫博客了,這部分的內容學過比較久了,今天整理一下方便他人也方便自己。
——2019-10-17 22:42:32