我有这个Python代码:
cv2.addWeighted(src1, 4, cv2.GaussianBlur(src1, (0, 0), 10), src2, -4, 128)
如何将其转换为Matlab?到目前为止我得到了这个:
f = imread0('X.jpg');
g = imfilter(f, fspecial('gaussian',[size(f,1),size(f,2)],10));
alpha = 4;
beta = -4;
f1 = f*alpha+g*beta+128;
我想减去局部平均彩色图像。
输入图片:
混合OpenCV的输出:
答案 0 :(得分:3)
cv2.addWeighted
的文档具有以下定义:
cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst
此外,对输出图像执行的操作是:
http://docs.opencv.org/2.4/_images/math/d9e87b75f6c0526dfca3f8c483fbda1ad7251046.png
因此,您的代码所做的完全正确......至少对cv2.addWeighted
而言。您将alpha
乘以第一张图片,再乘以beta
,将其乘以第二张图片,然后在此基础上添加gamma
。剩下要解决的唯一复杂问题是saturate
,这意味着任何超出您正在处理的数据类型的动态范围的值,您将其限制在那么多。由于结果中可能存在负数,因此saturate
选项仅表示生成任何负值0
的值以及任何大于预期最大值的值。在这种情况下,您需要使大于1的任何值等于1.因此,将图像转换为double
到im2double
是个好主意,因为您要允许超出动态范围的值的加法和减法首先发生,然后之后你就会饱和。通过使用图像的默认图像精度(uint8
),即使在saturate
操作发生之前也会发生饱和,并且会给出错误的结果。由于您正在执行此double
转换,因此您需要将gamma
的128加法转换为0.5以进行补偿。
现在,唯一的小问题是你的高斯模糊。 Looking at the documentation,通过cv2.GaussianBlur(src1, (0, 0), 10)
,您告诉OpenCV在标准偏差为10时推断掩模尺寸.MATLAB不会为您推断掩模的大小,因此您需要自己做。通常的做法是简单地找到标准偏差的六倍,取floor
并加1.这是掩模的水平和垂直尺寸。您可以在此处查看我的帖子,了解为什么这是常见做法:By which measures should I set the size of my Gaussian filter in MATLAB?
因此,在MATLAB中,您可以使用高斯模糊来实现此目的。顺便说一句,它只是imread
,而不是imread0
:
f = im2double(imread('http://i.stack.imgur.com/kl3Md.jpg')); %// Change - Reading image directly from StackOverflow
sigma = 10; %// Change
sz = 1 + floor(6*sigma); %// Change
g = imfilter(f, fspecial('gaussian', sz, sigma)); %// Change
%// Rest of the code is the same
alpha = 4;
beta = -4;
f1 = f*alpha+g*beta+0.5; %// Change
%// Saturate
f1(f1 > 1) = 1;
f1(f1 < 0) = 0;
我得到这张图片:
请注意,在MATLAB中OpenCV之间出现的方式略有不同......尤其是眼睛周围的徘徊。这是因为OpenCV在推断高斯模糊的掩模大小时会做一些不同的事情。我不知道发生了什么,但我如何通过查看标准偏差来指定掩模大小是最常见的启发式方法之一。玩弄标准差,直到得到你喜欢的东西。