如何提高我的图像质量?

3
我有一张三相图像,我使用自动阈值分割(multithresh)和'imquantize'函数进行了分割。在没有任何过滤操作的情况下,图像中有很多空洞。然而,当我使用中值滤波器时,这些空洞会减少,尽管过滤后仍然有相当多的空洞。 原始图像

Segmented Image after filtering

从这个点应用“imfill”函数会导致过度填充,如下图所示的红色圆圈部分。 FilledHoles image 代码如下:
%# 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',你会发现大部分黑色相位与实心(白色相位)接触。然而,自动分割并没有准确捕捉到这一点,因为分割图像周围有中间(灰色)相位的环。我该如何处理这个问题?
非常感谢您预期的帮助/建议。
1个回答

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
@User2201:我提出了去除灰色边框的建议。另外,当你说用孔填充后结果没有太大变化时,是指你最终的分析结果没有变化,还是说孔没有被填充? - Jonas
谢谢@Jonas。我感兴趣的是半月形以及三个相接触点。1英寸的磁盘尺寸似乎比2英寸或更大的更好。然而,与原始曲率相比,大多数部分的细节不够精细。还有什么其他建议吗?结构元素的类型怎么样?至于填补孔洞,我的意思是孔洞没有被填补。 - User2201
奇怪的是这些孔没有被填充。但由于我无法访问该图像,所以我对此无能为力。无论如何,由于边缘最重要,您可能希望直接处理它们,例如您可以运行Canny边缘检测器(当然在过滤后的图像上 - 可能需要考虑将中值滤波窗口增加到5x5或7x7,或使用各向异性扩散滤波),或在梯度图像上自己进行检测。 - Jonas
嗨,乔纳斯!非常抱歉我离开了这么长时间。因为压力巨大,所以我必须专注于主要的代码本身。我想我可能通过微调你的方法来解决问题。再次感谢你。现在我想找到一种方法来平滑图像的边缘。我会发一个新帖子,并发布我使用的代码。尽管如此,我仍然喜欢你的代码,因为它激励了我去尝试。再次感谢! - User2201

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接