1. 程式人生 > >python-影象邊緣化處理

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 plt

def 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)