课后作业——红细胞边缘检测

要求对下图的红细胞进行边缘检测,得到单像素点的八连通边缘 



我先做了灰度拉伸,将范围在[50,150]的灰度值拉伸到[30,250]之间,意外的发现可以将背景和边缘的灰度值分离,然后选择[35,115]范围内的像素点置为255,其余为0.初步得到边缘,如下图。



此时边缘具有一定的厚度,并且有些地方的边缘断开了,所以先做了闭运算,把一部分边缘连起来。并且做了skel运算,在视觉上看边缘已经是很细的了,但是之后做canny边缘检测还是出现了双边缘。


进行fill运算,将中间的红细胞的内部填满,这样可以避免内部的红细胞出现双边缘。


做canny边缘检测得到最后的结果,周围红细胞出现双边缘。如果能把周围的红细胞也像上一步一样填充满应该会好很多,但是不知道怎么实现,如果我收到把图像的边界上加一条白线会不会把整个图在填充的时候全变白了?  

扫描二维码关注公众号,回复: 1826471 查看本文章



可以试试用opencv的findcontours来进行边缘提取,看看能不能去掉双边缘。做了一整上午,我也算尽力了

后续思路是将所有的轮廓提取出来,然后对大小进行判断,小于一定阈值的就认为不是红细胞,但是关于双边缘的问题还是没法解决。


最后贴上自己的matlab代码。



I=imread('C:\\Users\\lenovo\\Desktop\\temp.bmp');
sigma = 1.6;      %sigma赋值  
N = 20;            %大小是(2N+1)×(2N+1)  
N_row = 2*N+1;  
gausFilter = fspecial('gaussian',[N_row N_row],sigma);
I=imfilter(I,gausFilter,'conv'); 

I=imadjust(I,[50/255,150/255],[30/255,250/255]);
Size=size(I);
for i=1:Size(1)
    for j=1:Size(2)
        if I(i,j)<=110&&I(i,j)>=35
            I(i,j)=255;
        else
            I(i,j)=0;
        end
    end
end
figure;imshow(I);
SE=strel('square',5);

I=imclose(I,SE);
I=bwmorph(I,'skel',Inf);
figure;imshow(I);
I=imfill(I,'holes');
 figure;imshow(I);
%figure;imshow(I); 
countours=edge(I,'canny');

figure;imshow(countours);


猜你喜欢

转载自blog.csdn.net/x670127565/article/details/79767960