パイソン+ OpenCVの画像のエッジ検出オペレータSOBELを達成するため、ROBERT

 A Pythonの画像のエッジ検出オペレータSOBEL、ロバートは、特定の機能を実行処理画像を達成するためのプロセスは、Jupyterノートブックのビットラフであってもよいです。:を参照することができますOpenCVのライブラリにインストールOpenCVのライブラリと要約問題のいくつかの下でPythonのインストール

 

コードを実装1.

インポートCV2
 インポートnumpyのAS NP
 インポートASのPLTのmatplotlib.pyplot 

#は抗カラー画像機能を実装
DEF :PointInvert(IMG)の
    高さ、幅、_ = img.shape
      I において:(高さ)範囲
         のために J レンジ(幅):
            PI = IMG [I、J] 
            IMG [I、J] = 255 - PI
 戻り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」という名前の画像src_sをして表示

#のSOBEL数をサブ 
ソーベルcv2.Sobel =(SRC、cv2.CV_64F ,. 1 ,. 1、ksize = 7 
cv2.imshow(" ソーベル"、ソーベル)"ソーベル"という名前の画像処理のsrc Sobelオペレータ後と表示絵抗カラー 
sobel2 = PointInvert(ソーベル)
cv2.imshow(" sobel2 "、sobel2)#1 "sobel2"に色が反転して表示さちなんで名付けられた画像ソーベル

ROBERT演算子
DEF ロバート(IMG):
    H、W、_ =img.shape 
    ロブ = [-1、-1]、[1,1 ]
     のために X における範囲(H)
         のY における範囲(W):
             もし(Y + 2 <= W)および(X + 2 <= H):
                imgChild = IMG [x:X + 2、Y:Y + 2、1 ] 
                list_robert =奪う* imgChildの
                IMG [x、y] = ABS(list_robert.sum()) 求和加绝对值
    リターンIMG 
ロバート = ロバート(SRC)
cv2.imshow(" ロバート"、ロバート)「ロバート」という名前や写真ROBERTのSRCとオペレータの後に表示

絵抗カラー 
robert2 = PointInvert(ロバート)
cv2.imshow(robert2 、robert2)#1 色反転「robert2」にちなんで名付けられたロバート・画像をそして、表示さ 
cv2.waitKey(0)

 

2.ファイル名を指定して実行結果

 

 

 

 

 

 

 

 

 

 

 

3.問題と解決策遭遇

(1)実行時:ValueErrorを:あまりにも多くの値を展開する(2を期待)

エラーコード: H、W = img.shape

エラーの理由:

最初img.shape [0]、[1]、[2]を理解します。

img.shape [0]:画像の垂直方向のサイズ(高さ)

img.shape [1]:画像横サイズ(幅)

img.shape [2]:画像のチャンネル数

行列、[0]の列の数を示す[1]の行数を示しています。

それはimg.shapeデフォルトパラメータ戻り値は数3である、と私は行方不明指定していない、見ることができます。

ソリューション:

パラメータが使用チャンネル画像の数としてここで使用されていない_は_ = img.shape、W = img.shape W Hを、より少ないパラメータコードhよりも表します。

 

(2)実行時:ValueErrorを:オペランドは、形状(2,2)(2,2,3)と一緒に放送することができませんでした

エラーコード: list_robert =ロブ* 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]。

 

おすすめ

転載: www.cnblogs.com/BIXIABUMO/p/12639418.html