Python+OpenCV實現圖像邊緣檢測算子SOBEL、ROBERT


 在Jupyter Notebook上使用Python實現圖像邊緣檢測算子SOBEL、ROBERT,這個過程中實現某些功能處理出來的圖像可能會有點粗糙。關於opencv庫的安裝可以參考:Python下opencv庫的安裝過程與一些問題匯總

 

1.實現代碼

import cv2 import numpy as np import matplotlib.pyplot as plt #實現圖片反色功能
def PointInvert(img): height, width, _ = img.shape for i in range(height): for j in range(width): pi = img[i, j] img[i, j] = 255 - pi return img #讀取原灰度圖片
src_s=cv2.imread("dip_switch_02.bmp") cv2.imshow("src_s", src_s)#將原圖片命名為“src_s”顯示出來 #圖片反色
src=PointInvert(src_s) cv2.imshow("src", src)#將圖片src_s反色處理后命名為“src”並顯示出來

#SOBEL算子
sobel = cv2.Sobel(src,cv2.CV_64F, 1, 1, ksize=7) cv2.imshow("sobel", sobel)#將SOBEL算子處理后的圖片src命名為“sobel”並顯示出來 #圖片反色
sobel2=PointInvert(sobel) cv2.imshow("sobel2", sobel2)#將圖片sobel反色處理后命名為“sobel2”並顯示出來

#ROBERT算子
def Robert(img): h,w,_ = img.shape rob = [[-1,-1],[1,1]] for x in range(h): for y in range(w): if (y + 2 <= w) and (x + 2 <= h): imgChild = img[x:x+2, y:y+2, 1] list_robert = rob*imgChild img[x, y] = abs(list_robert.sum())# 求和加絕對值
    return img robert = Robert(src) cv2.imshow("robert", robert)#將ROBERT算子處理后的圖片src命名為“robert”並顯示出來

#圖片反色
robert2=PointInvert(robert) cv2.imshow("robert2", robert2)#將圖片robert反色處理后命名為“robert2”並顯示出來
cv2.waitKey(0)

 

2.運行結果

 

 

 

 

 

 

 

 

 

 

 

3.遇到的問題及解決方法

(1) 運行時出現:ValueError: too many values to unpack(expect 2)

出錯代碼:h,w = img.shape

出錯原因:

首先了解img.shape[0]、[1]、[2]。

img.shape[0]:圖像的垂直尺寸(高度)

img.shape[1]:圖像的水平尺寸(寬度)

img.shape[2]:圖像的通道數

在矩陣中,[0]就表示行數,[1]則表示列數。

由此可知,img.shape默認返回值個數為3個,而我沒有指明缺失的參數。

解決方法:

此處未用到的參數為圖像的通道數,使用_代表用不到的參數,將代碼h,w = img.shape改為h,w,_ = img.shape。

 

(2) 運行時出現:ValueError: operands could not be broadcast together with shapes (2,2) (2,2,3)

出錯代碼:list_robert = rob*imgChild

出錯原因:

經過網上搜索解決方法,發現是違反了ufunc的廣播機制。廣播機制如下:

當使用ufunc函數對兩個數組進行計算時,ufunc函數會對這兩個數組的對應元素進行計算,因此它要求這兩個數組有相同的大小(shape相同)。如果兩個數組的shape不同的話,會進行如下的廣播(broadcasting)處理:

1)讓所有輸入數組都向其中shape最長的數組看齊,shape中不足的部分都通過在前面加1補齊。

2)輸出數組的shape是輸入數組shape的各個軸上的最大值。

3)如果輸入數組的某個軸和輸出數組的對應軸的長度相同或者其長度為1時,這個數組能夠用來計算,否則出錯。

4)當輸入數組的某個軸的長度為1時,沿着此軸運算時都用此軸上的第一組值。

我們圖片的shape是(h,w,c),而列表的shape是(x:x+2, y:y+2),根據規則1可知列表的shape拓展應為(x:x+2, y:y+2,1);由規則2可知輸出數組的shape應為(h,w,c),列表的shape不滿足規則3,所以出錯。

解決方法:

將代碼imgChild = img[x:x+2, y:y+2]改為imgChild = img[x:x+2, y:y+2, 1]。

 


免責聲明!

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



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