代码里面为什么加上cv2.CV_64F这个参数呢?为什么从黑到白的边界的导数是正数,而一个从白到黑的边界点导数却是负数呢?为什么把数据类型设置高一些就能解决负数问题呢?

问题描述:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('logo8.jpg',0)
#cv2.CV_64F 输出图像的深度(数据类型),可以使用-1, 与原图像保持一致 np.uint8
laplacian=cv2.Laplacian(img,cv2.CV_64F)
# 参数 1,0 为只在 x 方向求一阶导数,最大可以求 2 阶导数。
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
# 参数 0,1 为只在 y 方向求一阶导数,最大可以求 2 阶导数。
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()

在查看上面这个例子的注释时不知道你有没有注意到:当我们可以通过参数-1 来设定输出图像的深度(数据类型)与原图像保持一致,但是我们在代码中使用的却是cv2.CV_64F。这是为什么呢?想象一下一个从黑到白的边界的导数是正数,而一个从白到黑的边界点导数却是负数。如果原图像的深度是np.int8 时,所有的负值都会被截断变成0,换句话说就是把把边界丢失掉。所以如果这两种边界你都想检测到,最好的的办法就是将输出的数据类型设置的更高,比如cv2.CV_16S,cv2.CV_64F 等。取绝对值然后再把它转回到cv2.CV_8U。下面的示例演示了输出图片的深度不同造成的不同效果。

代码里面为什么加上cv2.CV_64F这个参数呢?为什么从黑到白的边界的导数是正数,而一个从白到黑的边界点导数却是负数呢?为什么把数据类型设置高一些就能解决负数问题呢?

问题解答:

在这段代码中,使用cv2.CV_64F作为参数的原因是为了确保在计算梯度时能够保留负值和更高的精度。因为边缘检测的结果可能会产生负值(例如,黑到白的变化是正值,而白到黑的变化是负值)。如果原图像的数据类型是np.int8,那么负值会被截断为0,导致边界信息的丢失。

从黑到白的边界的导数为正数,表示亮度的增加;而从白到黑的边界的导数为负数,表示亮度的减少。这种变化使得在进行边缘检测时,必须考虑到两种方向的导数值。

将数据类型设置为更高的类型(如cv2.CV_16Scv2.CV_64F)可以扩展可表示的数值范围,避免截断负值,从而保留完整的边缘信息。通过计算绝对值后再转换为cv2.CV_8U,可以有效显示边缘信息,同时确保图像在可视化时的正确性。

#################################################################

np.int8不能的数据范围不包含小于0的数字吗?而cv2.CV_64F的数据类型包含小于0的数字吗?

是的,np.int8的数据范围是从-128到127,因此可以表示负数。但在图像处理中,np.uint8(无符号整数)范围是0到255,这意味着不能表示负数。

cv2.CV_64F是一个双精度浮点数类型,能够表示正数、负数以及小数。因此,在进行边缘检测等计算时,使用cv2.CV_64F可以有效保留负值和小数,提高计算精度,避免因为截断而丢失重要的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神笔馬良

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值