2017-10-01 5 views
1

sobel演算子を手動で実装しようとしています。filter2D(OpenCV)を使用してSobel演算子を実行すると、Squaringで大きなノイズが発生する

何らかの理由で、オペレータの水平および垂直成分が良好な結果を示しているように見えますが、合成された画像には大きなノイズがあります。

私が(imgv ** 2)** 0.5のようなことをしたときに、それはまた、理想的にはほぼ同じイメージを取得する必要があるにもかかわらず、ノイズのトンを紹介します。

ここで何が起こっているか知っていますか?私はイメージを別の方法で組み合わせることになっていますか?

はここにpythonで私のコードです:

import cv2 
import numpy as np 

sobelX = np.array([[1,0,-1],[2,0,-2],[1,0,-1]]) 
sobelY = sobelX.T 

imgoriginal = cv2.imread("building.bmp") 

imgv = cv2.filter2D(imgoriginal, -1, sobelY) 
imgh = cv2.filter2D(imgoriginal, -1, sobelX) 
imgboth = (imgv**2 + img**2)**0.5 

これが出力されます。

enter image description here

答えて

3

更新良く方法。

enter image description here

#!/usr/bin/python3 
# 2017.12.22 21:48:22 CST 

import cv2 
import numpy as np 

## parameters 
sobelX = np.array([[1,0,-1],[2,0,-2],[1,0,-1]]) 
sobelY = sobelX.T 
ddepth = cv2.CV_16S 

## calc gx and gy 
#img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
img = cv2.GaussianBlur(img, (3,3), 0) 
gx = cv2.filter2D(img, ddepth, sobelX) 
gy = cv2.filter2D(img, ddepth, sobelY) 

## calc gridxy 
gxabs = cv2.convertScaleAbs(gx) 
gyabs = cv2.convertScaleAbs(gy) 
grad = cv2.addWeighted(gxabs, 0.5, gyabs, 0.5, 0) 

cv2.imwrite("result.png", grad) 

オリジナルの答え:

numpyのでOpenCVの画像に数学の操作を行う際うん、それは私を悩まました。画像データタイプは、デフォルトでnp.uint8です。したがって、可能な場合オーバーフロー/アンダーフロー数値演算を行う場合、変更しない場合パーセージ

これを試してみてください:

import cv2 
import numpy as np 

sobelX = np.array([[1,0,-1],[2,0,-2],[1,0,-1]]) 
sobelY = sobelX.T 

img = cv2.imread("cat.png") 

## Change the color space 
#img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

imgv = cv2.filter2D(img, -1, sobelY) 
imgh = cv2.filter2D(img, -1, sobelX) 

## Change the percision first, then do math operation 
imghv = (np.float32(imgv)**2 + np.float32(img)**2)**0.5 
#imghv = (np.float32(imgv)**2 + np.float32(img)**2)**0.5 

## Normalize and change the percision 
## Use cv2.convertScaleAbs() to convert value into the right range [0, 255] 
imghv = imghv/imghv.max()*255 
imghv = cv2.convertScaleAbs(imghv) 

## Display 
res = np.hstack((imgh, imgv, imghv)) 
cv2.imshow("Sobel", res) 
cv2.waitKey() 
cv2.destroyAllWindows() 

Colorful Sobel

Grayscale Sobel

関連する問題