如何将 cv2.addWeighted 和 cv2.GaussianBlur 转换为 MATLAB?

hem*_*ant 4 matlab opencv image image-processing

我有这个 Python 代码:

cv2.addWeighted(src1, 4, cv2.GaussianBlur(src1, (0, 0), 10), src2, -4, 128) 
Run Code Online (Sandbox Code Playgroud)

如何将其转换为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;
Run Code Online (Sandbox Code Playgroud)

我想减去局部平均彩色图像。

输入图像:

混合来自 OpenCV 的输出:

ray*_*ica 5

的文档cv2.addWeighted具有如下定义:

cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) ? dst
Run Code Online (Sandbox Code Playgroud)

此外,对输出图像执行的操作如下:


(来源:opencv.org

因此,您的代码所做的完全正确……至少对于cv2.addWeighted. 您将alpha乘以第一个图像,然后beta将其乘以第二个图像,然后gamma在此之上相加。剩下要处理的唯一复杂问题是saturate,这意味着超出您正在处理的数据类型的动态范围的任何值,您都可以限制它。由于结果中可能出现负数,该saturate选项仅意味着生成任何负值0以及任何大于该最大值的预期最大值的值。在这种情况下,你会想要做的任何值大于1等于1。因此,这将是一个好主意,你的图像转换成double通过im2double因为您希望首先对超出动态范围的值进行加减运算,然后再进行饱和。通过使用图像的默认图像精度(即uint8),甚至在saturate操作发生之前就会发生饱和,这会给你错误的结果。由于您正在进行此double转换,因此您需要将 128 的加法转换gamma为 0.5 以进行补偿。

现在,唯一的小问题是您的高斯模糊。 查看文档,通过执行cv2.GaussianBlur(src1, (0, 0), 10),您告诉 OpenCV 在标准偏差为 10 时推断掩码大小。MATLAB 不会为您推断掩码大小,因此您需要自己进行此操作。通常的做法是简单地找到标准偏差的 6 倍,取floor并加 1。这适用于面罩的水平和垂直尺寸。您可以在此处查看我关于为什么这是常见做法的理由的帖子: 我应该通过哪些措施在 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;
Run Code Online (Sandbox Code Playgroud)

我得到这个图像:

在此处输入图片说明

请注意,MATLAB 中的 OpenCV 之间的显示方式略有不同……尤其是眼睛周围的神圣部分。这是因为 OpenCV 在推断高斯模糊的掩码大小时做了一些不同的事情。这我不确定发生了什么,但是我如何通过查看标准偏差来指定掩码大小是最常见的启发式方法之一。玩弄标准偏差,直到你得到你喜欢的东西。