【问题标题】:What can I do to enhance my image quality?我可以做些什么来提高我的图像质量?
【发布时间】:2017-05-20 00:37:27
【问题描述】:

我有一个三相图像,我使用自动阈值(multithresh)和“imquantize”函数对其进行了分割。在没有任何过滤操作的情况下,我确实在图像中有很多洞。然而,当我使用中值滤波器时,这些漏洞会减少,尽管尽管进行了滤波,但仍有相当多的漏洞。

从这一点应用“填充”功能会导致“过度填充”,如下图红色圆圈部分所示。

代码如下:

%# Read in image
I = imread(‘original_image.jpg');
figure, imshow(I),axis off, title('Original Image');

%# Filter image
I = medfilt2(I);
% figure, imshow(I), title('Median-filtered image')

%# Segment image
thresh  = multithresh(I, 2);
BW      = imquantize(I, thresh);    
figure, imshow(BW,[]),axis off, title('Segmented Image'); 

%# Fill holes
BW2     = imfill(BW,'holes');    
figure, imshow(BW2, []); title('Filled holes image');

我只是想知道是否有更好的方法来处理这种情况。您认为使用“multithresh”和“imquantize”功能对分割是否足够好?分水岭可以做得更好吗?这里甚至有必要吗?

一般来说,我可以做些什么来提高输出图像的质量?

我问的原因是,如果您缩放原始图像的“imshow”,您会注意到大部分黑色相接触固体(白色相)。然而,自动分割并不能准确地捕捉到这一点,因为分割的图像在固相周围有中间(灰色)相环。我该如何处理?

非常感谢您的预期帮助/建议。

【问题讨论】:

    标签: matlab image-processing image-enhancement


    【解决方案1】:

    你的方法是否足够好在很大程度上取决于你想在这里实现什么。例如,边界需要多平滑?

    针对您的具体问题:您的量化图像具有三个级别,0(黑色)、1(灰色)和 2(白色)。您似乎想关闭灰色区域中的小黑洞。为此,只需创建一个仅包含灰色像素的单独二进制图像,然后组合回您的多级图像(您不应该将其称为 BW,因为 Matlab 文档在任何地方都将其用于二进制图像,如果您应该保持一致可以)。

    % pull out the gray "channel"
    grayPixels = BW==1; % will have ones everywhere there's gray, and 0 otherwise
    
    % to close holes up to a maximum size, invert the image (holes become islands) 
    % and eliminate small islands with bwareaopen
    invGray = ~grayPixels;
    invGray = bwareaopen(invGray,100); % closes holes up to 100pix size - adjust
    grayPixels = ~invGray; % imshow to view result
    
    % merge gray channel back in. Note we want black->gray, 
    % but we don't want white->gray. 
    % Since black/gray/white are 0/1/2, if we take the maximum of the gray 
    % (which is 0/1) and your "BW" (which is 0/1/2), we replace 0 in BW with 1 
    % wherever we have closed a hole
    
    BW = max(BW,double(grayPixels);
    imshow(BW,[]);
    

    同样,您可以在“黑色”通道上运行bwareaopen 以去除各处的白点。

    您可以类似地从BW 中拉出“白色”通道,以便在大球形颗粒上进行分水岭,您很可能会得到一个不错的结果(如果白色颗粒是您所追求的)。


    如果你想让白色颗粒周围的灰色细边框消失,你可以尝试形态学打开。基本上,您将灰色区域缩小几个像素(侵蚀),然后将其重新增长几个像素(膨胀)。一条细细的灰线将完全消失,因此不会再长出任何东西。

    % take the gray "channel" again (after closing the small holes)
    grayPixels = BW == 1;
    grayPixelsOpened = imopen(grayPixels,strel('disk',3)); % play with the radius 3 to get the desired result
    
    % everything that used to be gray and is no longer so needs to be turned black 
    % in the original image
    BW(grayPixels~=grayPixelsOpened) = 0;
    

    会有一些折衷,因为灰色阶段的弯月面将不再那么尖锐。如果需要,您可以通过黑色通道的后续打开来恢复一些。

    【讨论】:

    • 感谢您的回复和建议。即使我调整像素大小,结果似乎也没有太大变化。尽管如此,我刚刚从后续分析中意识到,主要问题是分割的准确性(请参阅我的问题最后一行之前的最后一段)。请问有什么建议吗?
    • @User2201:我提出了删除灰色边框的建议。另外,当你说填洞后结果没有太大变化时,你的意思是你的最终分析结果没有改变,或者洞没有被填满?
    • 谢谢@Jonas。半月板以及三个阶段之间的接触点是我感兴趣的最重要的特征。磁盘大小为 1 似乎优于 2 或更大。但是,与原始曲率相比,大多数部分的曲率细节都没有那么精细。关于还有什么要考虑的其他建议? \那么结构元素的类型呢?至于填洞,我的意思是没有填洞。
    • 奇怪的是洞没有被填满。但是由于我无权访问该图像,因此我对此无能为力。无论如何,由于边缘是最重要的,您可能想直接追踪它们,例如您可以运行 Canny 边缘检测器(当然是在过滤后的图像上 - 可能需要考虑将中值过滤器窗口增加到 5x5 或 7x7,或者使用各向异性扩散过滤),或在梯度图像上滚动您自己的检测。
    • 嗨乔纳斯!我很抱歉我不得不离开这么长时间。我承受着巨大的压力,因此不得不专注于主要代码本身。我想我可能已经通过稍微调整你的方法来解决这个问题。非常感谢。我现在想要的是找到一种方法来平滑图像中的边缘。我会为此写一篇新文章,并贴出我使用的代码。尽管如此,我仍然会喜欢你的代码,因为它给了我尝试的动力。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多