边缘检测
今天在做图像边缘检测的时候遇到了一个比较奇怪的事情,看起来很相似的代码在MATLAB和Python中跑出的结果却不相同。在边缘检测的代码中我定义了一个简单的kernel为[1, -1]用来检测图片的边缘,然后分别和得到的图像进行卷积,最终输出图像。
- Python代码:
img = cv2.imread("lena.bmp")
my_kernel = [1, -1]
my_kernel = np.reshape(my_kernel, (1, 2))
my_kernel2 = my_kernel.T
res_img = cv2.filter2D(img, -1, np.array(my_kernel))
cv2.imshow('', res_img)
cv2.waitKey(0)
- Python端得到的图像:
- MATLAB代码:
I = imread( 'lena.bmp' );
my_kernel = [1, -1];
res = conv2(I, my_kernel);
imshow(res);
- MATLAB端得到的图像:
当我仔细观看MATLAB里面变量的变量类型才明白了图片差异的原因。
在上面的MATLAB代码中经过了I = imread( 'lena.bmp' )
后得到I这个矩阵里面的类型为uint8, 而经过my_kernel = [1, -1]
后my_kernel里元素的类型为double,经过conv2之后得到的类型为double.在imshow()里面如果是double类型,则默认范围是(0,1),所以我们能够看到图片中有了这么多的白点。
假如我们将里面的值转为uint8,则会发现MATLAB里面的图片和Python中的一样了。
那么为什么Python中一开始就是那张暗的图呢,因为在Python里创建kernel的时候里面元素默认的是int32类型,所以卷积之后仍然得到的是int32类型。