python-影象邊緣化處理
本文由本人原創,僅作為自己的學習記錄
主要利用Sobel,用作邊緣檢測,它是一離散性差分運算元,用來運算影象亮度函式的灰度值。在影象的任何一點使用此運算元,將會產生對應的灰度向量或是其法向量。
Sobel邊緣檢測通常帶有方向性,可以只檢測豎直邊緣或垂直邊緣或都檢測。
本文先對圖片進行大小處理,使得都是一個大小的圖片
然後從XY兩個方向檢測,然後利用addweight進行影象混合
然後設定閾值,進行影象二值化處理,本,文中設定的是100,如果原灰度值大於100,把灰度值設為0(黑色),因為邊緣為白色要變成黑色,如果小於100,設為255(白色)THRESH_BINARY_INV(二值化取反)
下面是程式碼
#coding=utf-8
import cv2 as cv
import os
import matplotlib.pyplot as pltdef set_img_size(path,file):
src_img = cv.imread(file, cv.IMREAD_GRAYSCALE)
dst_img= cv.resize(src_img,(220,350))
cv.imwrite(path+'\\2_tmp.jpg',dst_img)
return path+'\\2_tmp.jpg'
if __name__=="__main__":
path=os.getcwd()
file = path+'\\2.jpg'
file_name = set_img_size(path,file)
sobel_img = cv.imread(file_name, cv.IMREAD_GRAYSCALE)
x= cv.Sobel(sobel_img,cv.CV_16S,1,0)#x方向邊緣檢測
y= cv.Sobel(sobel_img,cv.CV_16S,0,1)
#x,y方向分辨轉換為uint8(8位無符號)型別
ux = cv.convertScaleAbs(x)
uy = cv.convertScaleAbs(y)
#x,y合併
sb_img = cv.addWeighted(ux,0.5,uy,0.5,0)
#設定閾值,如果原值大於100,設為0,因為邊緣為白色要變成黑色,如果小於100,設為255ֵ
retval,sb_img = cv.threshold(sb_img,100,255.0, cv.THRESH_BINARY_INV)
cv.imshow("result",sb_img)
#cv.waitKey(0)
cv.destroyAllWindows()
cv.imwrite(path+'\\2_result.jpg',sb_img)