用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之后的步骤会映射到正确的范围,但不会调整类型:

img_edge = (img_edge / np.max(img_edge)) * 255

您可以知道,因为最小/最大打印输出中都有一个小数点,通常只有在您打印浮点类型时才会发生这种情况。

再增加一步:

cv2.imshow('imagey',img_edge.astype(np.uint8))

或单独执行

img_edge = img_edge.astype(np.uint8)