opencv——常見的操作


 

一 圖像閾值處理

准備一張灰度圖像

 

 

 

 

 

 

 

閾值處理通常是設定一個閾值,讓圖片的所有像素點的值與其比較做出一系列的操作。

在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. 梯度運算(膨脹-腐蝕)

img2=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel=numpy.ones((5,5 ),numpy.uint8))
cv2.imshow( " IMage ",img2)

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM