我使用gaussianBlur来获得图像的高通,但是cv.subtract()函数似乎不能逐个像素地减去两个图像。我通过首先从输入图像中减去模糊图像,然后再将模糊图像加到结果中来确认这一点。这样做的话,输出应该与输入图像相同,但它是不同的。
img=src
cv.GaussianBlur(img, blur, new cv.Size(21, 21), 0,0,cv.BORDER_DEFAULT)
let x = new cv.Mat()
let y = new cv.Mat()
cv.subtract(img,blur,x)
cv.add(x,blur,y)
以下是参考input image、blurred image、output image的图像
1条答案
按热度按时间r7xajy2e1#
如前所述,
cv.add
和cv.subtract
函数将uint8
求和/相减元素裁剪到范围[0,255]。解决方案是将
mat
数据类型从uint8
转换为更大的数据类型int16
。裁剪示例(伪代码):
cv.add(uint8(200), uint8(100))
等于uint8(255)
(而不是300)。cv.subtract(uint8(10), uint8(20))
等于uint8(0)
(而不是-10)。这意味着计算:
uint8(200)
+uint8(100)
-uint8(100)
,得到155
(而不是回到原始值200)。解决方案是将
mat
数据类型从uint8
转换为更大的数据类型int16
。int16
元素被剪切到范围[-32768,32767],我们没有接近这些范围限制。计算:
int16(200)
+int16(100)
-int16(100)
,结果200
(因为int 16(200)+int 16(100)= int 16(300)。不会发生剪切...使用convertTo成员函数执行从
uint8
到int16
的转换:然后将
cv.subtract
和cv.add
套用至int16
元素:最后,我们可以将结果转换回
uint8
类型:下面是一个应用上述过程并验证
out
=img
的示例: