使用 np.sqrt 处理后无法显示图像
Can't visualize image after process it with np.sqrt
我正在尝试使用 perwit 内核进行边缘检测。
我的问题是当我尝试将水平渐变与垂直渐变“合并”时,因为在它之后我在 cv2.imshow() 函数中得到一个错误,似乎图像有失真。
这是我的代码
imgx = filter_image(img,kx,3)
imgy = filter_image(img,ky,3)
img_edge = np.sqrt(np.power(imgx, 2) + np.power(imgy, 2))
img_edge = (img_edge / np.max(img_edge)) * 255
print(np.shape(img_edge))
print(np.min(img_edge))
print(np.max(img_edge))
cv2.imshow('imagey',img_edge)
这是我的输出
(256, 256)
0.0
255.0
Traceback (most recent call last):
File "<ipython-input-17-c200db56adba>", line 1, in <module>
runfile('C:/Users/giorg/Desktop/Elte/Image Analysis/Lab 1/filter.py', wdir='C:/Users/giorg/Desktop/Elte/Image Analysis/Lab 1')
File "C:\Users\giorg\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
execfile(filename, namespace)
File "C:\Users\giorg\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/giorg/Desktop/Elte/Image Analysis/Lab 1/filter.py", line 58, in <module>
cv2.imshow('imagey',img_edge)
TypeError: Expected Ptr<cv::UMat> for argument 'mat'
我不知道为什么,但我认为问题出在 np.sqrt()。如果我简单地将 imgy 和 imgx 相加,它就可以工作了。
问题是你传入的是 np.float64
的数组,而不是 openCV 可以理解的类型,例如 np.unit8
。具体来说,sqrt
后的step映射到正确的范围,但不调整类型:
img_edge = (img_edge / np.max(img_edge)) * 255
你可以看出,因为 min/max 打印输出中有一个小数点,这通常只在你打印浮点类型时才会发生。
再添加一步:
cv2.imshow('imagey', img_edge.astype(np.uint8))
或者单独做:
img_edge = img_edge.astype(np.uint8)
我正在尝试使用 perwit 内核进行边缘检测。
我的问题是当我尝试将水平渐变与垂直渐变“合并”时,因为在它之后我在 cv2.imshow() 函数中得到一个错误,似乎图像有失真。
这是我的代码
imgx = filter_image(img,kx,3)
imgy = filter_image(img,ky,3)
img_edge = np.sqrt(np.power(imgx, 2) + np.power(imgy, 2))
img_edge = (img_edge / np.max(img_edge)) * 255
print(np.shape(img_edge))
print(np.min(img_edge))
print(np.max(img_edge))
cv2.imshow('imagey',img_edge)
这是我的输出
(256, 256)
0.0
255.0
Traceback (most recent call last):
File "<ipython-input-17-c200db56adba>", line 1, in <module>
runfile('C:/Users/giorg/Desktop/Elte/Image Analysis/Lab 1/filter.py', wdir='C:/Users/giorg/Desktop/Elte/Image Analysis/Lab 1')
File "C:\Users\giorg\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
execfile(filename, namespace)
File "C:\Users\giorg\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/giorg/Desktop/Elte/Image Analysis/Lab 1/filter.py", line 58, in <module>
cv2.imshow('imagey',img_edge)
TypeError: Expected Ptr<cv::UMat> for argument 'mat'
我不知道为什么,但我认为问题出在 np.sqrt()。如果我简单地将 imgy 和 imgx 相加,它就可以工作了。
问题是你传入的是 np.float64
的数组,而不是 openCV 可以理解的类型,例如 np.unit8
。具体来说,sqrt
后的step映射到正确的范围,但不调整类型:
img_edge = (img_edge / np.max(img_edge)) * 255
你可以看出,因为 min/max 打印输出中有一个小数点,这通常只在你打印浮点类型时才会发生。
再添加一步:
cv2.imshow('imagey', img_edge.astype(np.uint8))
或者单独做:
img_edge = img_edge.astype(np.uint8)