- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有这段 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 的输出:
最佳答案
cv2.addWeighted
的文档具有这样的定义:
cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst
此外,对输出图像执行的操作如下:
(来源:opencv.org)
因此,您的代码所做的是完全正确的……至少对于 cv2.addWeighted
而言。您采用 alpha
,将其乘以第一张图像,然后将其乘以 beta
,将其乘以第二张图像,然后在其上添加 gamma
。唯一需要处理的复杂问题是 saturate
,这意味着任何超出您正在处理的数据类型的动态范围的值,您都可以将其限制在那个范围内。因为结果中有可能出现负数,saturate
选项只是意味着使任何负值 0
和任何大于最大预期值的值到那个最大值在这种情况下,您需要使任何大于 1 的值都等于 1。因此,通过 im2double
将图像转换为 double
是个好主意。因为您希望允许首先发生超出动态范围的值的加减,然后您在之后饱和。通过使用图像的默认图像精度(即 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 在推断高斯模糊的掩码大小时做了一些不同的事情。我不确定这是怎么回事,但是我如何通过查看标准差来指定掩码大小是最常见的启发式方法之一。尝试使用标准偏差,直到得到您喜欢的结果。
关于image - 如何将 cv2.addWeighted 和 cv2.GaussianBlur 转换成 MATLAB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33832728/
我不是 C++、OpenCV 和 CUDA 的专家,也不明白为什么 cv::gpu::warpPerspective(g_mask, g_frame, warp_matrix, g_frame.siz
我希望高斯模糊操作是对称的,但使用 OpenCV 2.4.11 GaussianBlur我遇到了不同。 这是一个例子。我申请 GaussianBlur图像,以及图像的翻转版本。我已经单独验证了 fli
我正在尝试使用 GaussianBlur 处理图像。 但我无法让它发挥作用。它说: Uncaught TypeError: fields[fieldName].write is not a funct
我是新手 OCV 和 android 开发人员。我想在我的应用程序中使用 Imgproc.GaussianBlur 过滤器。当我使用它时,应用程序发送“应用程序已停止”。我只在“OpenCV 教程 3
使用 PIL 读取图像后,我通常使用 scipy.ndimage 执行高斯滤波器,如下所示 import PIL from scipy import ndimage PIL_image = PIL.I
有人知道如何在 div 标签后面的所有内容上重现高斯模糊效果吗? 我在谷歌上搜索了几个月,我发现只有使用canvas utilities 对图像播放的效果..但这不是我要找的。 同样,jQuery 的
我在 viewController 的 viewDidLoad 中使用以下函数创建模糊效果 func applyBlurEffect(image: UIImage){ let imag
我正在尝试在 Python 中移植一些 lua/torch 代码,有一个序列在图像上运行高斯模糊,如下所示: local gauK = image.gaussian(math.ceil(3*sigma
import UIKit import QuartzCore class FirstView: UIView { var copyright = CATextLayer() overr
我发布了我的一小部分代码,因为我不断收到一个我似乎无法摆脱的奇怪错误。可以在这一行找到问题:Imgproc.GaussianBlur(mGray, mGray, new Size (5,5), 2.2
我正在尝试使用 Python OpenCV 对视频流进行高斯滤波器,但出现错误: blur = cv.GaussianBlur(dst, (5, 5), 0) AttributeError: 'mod
我发布了我的一小部分代码,因为我不断收到一个我似乎无法摆脱的奇怪错误。可以在这一行找到问题:Imgproc.GaussianBlur(mGray, mGray, new Size (5,5), 2.2
我是opencv的新手。我应该为涉及使用 2D 低通高斯滤波器的项目执行操作。我用的OpenCV是2.2的,里面有两个函数:filter2d()和GaussianBlur()。 执行相同的工作?让我解
我有这段 Python 代码: cv2.addWeighted(src1, 4, cv2.GaussianBlur(src1, (0, 0), 10), src2, -4, 128) 如何将其转换为
当我调用 Imgproc.GaussianBlur(dst, dst ,new Size(3,3),1);在我的应用程序中它工作得很好。一旦我将内核大小增加到 new Size(4,4) 否则我会得到
我希望你能帮助我。 我正在使用 QT 并尝试对图像的边缘进行简单检测。但是当我启动时我的程序崩溃了 cv::GaussianBlur( src, src, cv::Size(3,3), 0, 0, c
我正在尝试使用以下代码片段创建模糊效果: let glowEffectNode = SKEffectNode() glowEffectNode.shouldRasterize = true
我是一名优秀的程序员,十分优秀!