【问题标题】:How do I denoise a simple grayscale image如何对简单的灰度图像进行降噪
【发布时间】:2014-12-28 10:04:57
【问题描述】:

这是视觉效果更好的原始图像:我们可以看到主骨架周围有很多噪点,圆圈的东西,我想将它们移除,并且不影响主骨架。不知道是不是叫噪音

我这样做是为了对图像进行去模糊处理,这个图像是运动模糊内核,它在相机捕获图像时识别相机运动。

ps:这个图像是一个案例的内核,我需要的是一个通用的方法。谢谢你的帮助

CVPR2014 有一篇名为“Separable Kernel for Image Deblurring”的论文谈到了这一点,我想提取图像的主要骨架以使内核更加健壮,抱歉这里的解释因为我的英语不好

这是真正的灰度图像:

我希望它是这样的:

我如何使用 Matlab 来做到这一点?

这里有一些其他的内核镜像:

【问题讨论】:

  • 添加其他标签以检索此问题
  • 顺便说一句,这不是二进制图像。这实际上是灰度。您可以看到两个图像之间的不同灰度。二进制应该只显示黑白强度。
  • 谢谢提醒
  • 那些图片太小了。我们如何用这些图像直观地评估正确的结果?我投票结束你的问题。太宽泛了...而且您总是缺少信息。

标签: matlab image-processing


【解决方案1】:

正如 @rayryeng​​strong> 所解释的那样,中值滤波是清除图像中噪声的最佳选择,我在研究图像恢复时意识到了这一点。但是,就您而言,在我看来,您需要做的不是清除图像中的噪声。您希望更有可能消除图像中的火花。

我只是对您的嘈杂图像应用了单一阈值以消除火花。

试试这个:

desIm     = imread('http://i.stack.imgur.com/jyYUx.png');  % // Your expected (desired) image
nIm       = imread('http://i.stack.imgur.com/pXO0p.png');  % // Your original image
nImgray   = rgb2gray(nIm); 
T         = graythresh(nImgray)*255; % // Thereshold value
S         = size(nImgray);
R         = zeros(S) + 5;            % // Your expected image bluish so I try to close it
G         = zeros(S) + 3;            % // Your expected image bluish so I try to close it
B         = zeros(S) + 20;           % // Your expected image bluish so I try to close it
logInd    = nImgray > T;             % // Logical index of pixel exclude spark component
R(logInd) = nImgray(logInd);         % // Get original pixels without sparks
G(logInd) = nImgray(logInd);         % // Get original pixels without sparks
B(logInd) = nImgray(logInd);         % // Get original pixels without sparks
rgbImage  = cat(3, R, G, B);         % // Concatenating Red Green Blue channels
figure,
subplot(1, 3, 1)
imshow(nIm); title('Original Image');
subplot(1, 3, 2)
imshow(desIm); title('Desired Image');
subplot(1, 3, 3)
imshow(uint8(rgbImage)); title('Restoration Result');

我得到的是:

【讨论】:

  • 阈值似乎更适合这里。但是为了提高效率,我会简单地做R(nImR > T) = nImR(nImR > T)。对其他通道重复相同的操作。尽可能使用逻辑索引而不是find。另外R可以初始化为5*ones(S)等等。
  • 谢谢你的回答,我已经在我的代码中设置了一个阈值,抱歉我没有把问题说清楚,我已经编辑过了,这个阈值似乎适用于这个内核映像,但不要适合其他人,所以我需要的是一种通用方法,而不仅仅是调整不同图像的阈值。
  • @adlyy - 欢迎您。其实你的问题还不清楚。您应该添加一些其他内核图像以了解它们的外观,以便有人可以找到如何制作通用方法。顺便说一句,如果唯一的问题是自动调整阈值,您可以使用 graythresh() 来完成,检查我的答案我已经编辑了它..
  • 谢谢你,很好,其实我的问题是我想提取内核图像的主骨架对图像进行去噪。但是我使用了一些骨架提取代码,它们效果不佳。 CVPR2014 有一篇论文讨论过这个,但是没有开源。
  • @adlyy - 对我来说,很难理解其他图像的主要骨架是什么:/ 如果您提供更多解释,我们可以考虑解决方案..
【解决方案2】:

我能看到的两个图像之间唯一的不同是对象周边存在一些量化噪声/误差。这类似于salt and pepper noise,消除噪音的最佳方法是使用median filtering。中值滤波器主要分析图像中的局部重叠像素邻域,对强度进行排序并选择中值作为每个像素邻域的输出。椒盐噪声通过随机选择像素并将其强度设置为黑色(胡椒)或白色(盐)来破坏图像像素。通过使用中值滤波器,对强度进行排序将这些噪声像素置于低端和高端,通过选择中值,您将获得可能存在的最佳强度。

要在 MATLAB 中进行中值滤波,请使用 medfilt2 函数。这是假设您安装了图像处理工具箱。如果你不这样做,那么我所提议的将行不通。假设您确实拥有它,您可以通过以下方式调用它:

out = medfilt2(im, [M N]);

im 将是在imreadM 中加载的图像,N 是您要分析的像素邻域大小的行和列。通过选择一个 7 x 7 像素邻域(即M = N = 7),并直接从 StackOverflow 读取您的图像,这是我得到的结果:

将此图片与您的原始图片进行比较:

如果您还查看您想要的输出,这或多或少模仿了您想要的。

另外,我使用的代码如下...只有三行!

im = rgb2gray(imread('http://i.stack.imgur.com/pXO0p.png'));
out = medfilt2(im, [7 7]);
imshow(out);

第一行我必须将您的图像转换为灰度,因为原始图像实际上是 RGB。我不得不使用rgb2gray 来做到这一点。第二行使用 7 x 7 邻域对您的图像执行中值滤波,最后一行在带有imshow 的单独窗口中显示图像。


想自己实现中值过滤吗?

如果您想了解如何自己实际编写中值过滤算法,请在此处查看我最近的帖子。提问者要求在不使用medfilt2 的情况下实现过滤机制,我提供了答案。

Matlab Median Filter Code


希望这会有所帮助。

祝你好运!

【讨论】:

  • 谢谢你的回答,非常详细,虽然这不是我想要的,我不想影响图像的主要骨架,圆圈部分,但你提供了一个非常好的想法,我将添加我的代码,看看它是否有效。再次感谢您。
  • 一如既往的好解释
  • @adlyy 你没有在你的帖子中说得很清楚。编辑您的问题以反映这一点。 FWIW,您收到了反对票,因为您的要求不清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 2012-07-27
  • 2013-04-26
  • 2019-04-21
  • 1970-01-01
相关资源
最近更新 更多