基于matlab的传统算法分割

需求:运用形态学方法先分割出细胞膜的结构,然后运用圆形膨胀法扩展整个细胞范围

分割

 Orig=imread('F:\ProgramFiles\MATLAB\R2016a\bin\1G.bmp');
 I=rgb2gray(Orig);%转为灰度图像

原图:

 

自定阈值分割

 FG1=I>125    %大于125的地方为白(1),小于为黑(0)

OtSU阈值分割

Otsu阈值分割,可以借助函数graythresh来自动获取阈值,然后根据这个阈值进行分割;

 M=graythresh(I)%自动获取阈值
 FG2=im2bw(I,M);%根据M的大小来进行分割

 

迭代阈值分割

首先是读取灰度图片,设置一个精度值(这里设的是S),在设置一个初值变量S1等于灰度图最大值和最小值之和的二分之一,再设置两个变量r1和r2,r1是所有大于初值变量S1的元素和,r2是所有小于等于S1的元素和;在设置变量S2等于(r1的平均数+r2的平均数)/2;在进入while循环,经过转换,让S1等于S2,再重复进行前几步,直到精度小于设定的精度S1;这时得到的S2为阈值,再通过im2bw来显示二值图;

 I=im2double(I);
 S=0.1;
 S1=(max(I(:))+min(I(:)))/2;
 r1=find(I>S1);
 r2=find(I<=S1);
 S2=(mean(I(r1))+mean(I(r2)))/2;
 while abs(S2-S1)>S
    S1=S2;
    r1=find(I>S1);
    r2=find(I<=S1);
    S2=(mean(I(r1))+mean(I(r2)))/2;
 end
 FG3=im2bw(I,S2);

 

区域生长法(有缺陷)

  1. 鼠标点击选取生长点

  2. 3*3 8-邻域生长

  3. 生长准则:图像与生长点灰度差小于阈值

  4. 生长点压入栈中,直到栈中没有元素时停止

I= imread('F:\Program Files\MATLAB\R2016a\bin\1G.bmp');
 %imshow(I)
 ​
 %I=rgb2gray(Orig)
 ​
 ​
 if isinteger(I)
     I=im2double(I);
 end
 I = rgb2gray(I);
 ​
 figure 
 imshow(I)
 [M,N]=size(I);
 [y,x]=getpts; %单击取点后,按enter结束
 x1=round(x);
 y1=round(y);
 seed=I(x1,y1); %获取中心像素灰度值
 ​
 J=zeros(M,N);
 J(x1,y1)=1;
 ​
 count=1; %待处理点个数
 threshold=0.15;
 while count>0
     count=0;
     for i=1:M %遍历整幅图像
     for j=1:N
         if J(i,j)==1 %点在“栈”内
         if (i-1)>1&(i+1)<M&(j-1)>1&(j+1)<N %3*3邻域在图像范围内
             for u=-1:1 %8-邻域生长
             for v=-1:1
                 if J(i+u,j+v)==0&abs(I(i+u,j+v)-seed)<=threshold
                     J(i+u,j+v)=1;
                     count=count+1;  %记录此次新生长的点个数
                 end
             end
             end
         end
         end
     end
     end
 end
 ​
 subplot(1,2,1),imshow(I);
 title('original image')
 subplot(1,2,2),imshow(J);
 title('segmented image')
 ​
 ​

 

缺点:只会生长鼠标所选位置周围

分水岭分割算法⭐️⭐️⭐️

原博客地址:MATLAB图像分割——标记分水岭分割算法matlab分水岭算法计算机视觉从零学的博客-CSDN博客

1.步骤:

➊读取图像; ❷求取图像的边界,在此基础上可直接应用分水岭分割算法,但效果不佳; ❸对图像的前景和背景进行标记,其中每个对象内部的前景像素值都是相连的,背景里面的每个像素值都不属于任何目标物体; ❹计算分割函数,应用分水岭变换。

2.读取图像并求其边界

rgb = imread('F:\Program Files\MATLAB\R2016a\bin\1G.bmp');%读取原图像
 I = rgb2gray (rgb) ; %转化为灰度图像
 figure; subplot (121) %显示灰度图像
 imshow (I)
 text (732, 501, ' Image courtesy of Corel', ...
 'FontSize', 7, 'HorizontalAlignment' , ' right')
 hy = fspecial('sobel') ;%sobel算子
 hx = hy';
 Iy = imfilter(double(I),hy,'replicate');%滤波求y方向边缘
 Ix = imfilter(double(I),hx,'replicate');%滤波求x方向边缘
 gradmag = sqrt(Ix.^2 + Iy.^2);%求模
 subplot(122) ; imshow (gradmag, []),%显示梯度
 title ('Gradient magnitude (gradmag)')

 

3.分别对前景和背景进行标记

使用形态学重建技术对前景对象进行标记,首先使用imopen函数对图像进行开操作,如图3中左边图像所示,使用半径为20的圆形结构元素,开操作是膨胀和腐蚀操作的结合。另外一种方法是先对图像进行腐蚀,然后对图像进行形态学重建,处理后的图像如图右边图像所示。

 se = strel('disk', 20) ; %圆形结构元素
 Io = imopen(I,se) ;%形态学开操作
 figure; subplot(121);
 imshow(Io),% 显示执行开操作后的图像
 title('形态学开操作')
 Ie = imerode(I, se);%对图像进行腐蚀
 Iobr = imreconstruct(Ie,I) ;%形态学重建
 subplot (122); imshow(Iobr), %显示重建后的图像
 title ('形态学腐蚀重建之后 ')

在开操作之后进行关操作可以去除一些很小的目标,例如苹果上的茎干和一些污点等,如下图中左边图像所示。另外一种方法是先对图像进行腐蚀,然后对图像进行形态学重建,重建后的图像如图右边图像所示,注意在重建之前需要先对图像求反,然后在重建之后再进行一次求反。

Ioc=imclose(Io,se);%形态学关操作
 figure; subplot(121)
 imshow(Ioc),%显示关操作后的图像
 title('关操作 ')
 Iobrd = imdilate(Iobr, se) ; %对图像进行膨胀
 Iobrcbr = imreconstruct(imcomplement (Iobrd),imcomplement(Iobr)) ;%形态学重建
 Iobrcbr = imcomplement(Iobrcbr);%图像求反
 subplot(122); imshow(Iobrcbr),%显示重建求反后的图像
 title ('腐蚀重建之后求反 ')

对比两幅图像l,以重建为基础的开关操作比一般的开关操作(纵向两幅)在去除小的污点时会更有效,并且不会影响这个图像的轮廓

求腐蚀重建之后的极大值:

fgm = imregionalmax(Iobrcbr) ; %局部极大值
 figure; imshow(fgm), %显示重建后局部极大值图像
 title ('Regional maxima of opening-closing by reconstruction (局部极大值) ')

 

4.求原图的极大值:

为了更好地理解这个结果,我们可以在原来图像的基础上,显示局部极大值,对前景图像进行标记

I2=I;
 I2(fgm) = 255;%局部极大值处像素值设置为255
 figure; imshow(I2),%在原图上显示极大值区域
 title (' Regional maxima superimposed on original image (在原图求极大值) ')

 

注意到图像中还有少部分目标物体,未被正确地标记出,如果这些目标物体不能被正确地进行标记,则不能正确地进行分割。并且,少部分前景目标物体已经扩展到边缘,因此应该收缩一下边缘,可以先对图像进行关操作,然后再进行腐蚀来达到这样的效果。   这个过程会产生一些孤立的像素点,可以使用bwareaopen函数来达到这样的效果,这个过程将像素点数量较少的孤立像素点去除,如下图左边图像所示。 ​ 将图像Iobrcbr 使用合适的阈值转化成二值图像,其中淡颜色的值为背景,转化成的二值图像如图右边图像所示

 
se2 = strel (ones(5,5));%结构元素
 fgm2 = imclose(fgm,se2);%关操作.
 fgm3 = imerode (fgm2, se2) ; %腐蚀
 fgm4 = bwareaopen (fgm3, 20) ;%开操作
 I3=I;
 I3 (fgm4) = 255;%前景处设置为255
 figure; subplot (121)
 imshow (I3) %显示修改后的极大值区域
 title ( 'Modified regional maxima')
 bw = im2bw (Iobrcbr, graythresh (Iobrcbr)) ; %转化为二值图像
 subplot (122); imshow(bw), %显示二值图像
 title ('Thresholded opening-closing by reconstruction')

求蛋白质含量Demo

%imshow(red_gray)bgm_ = imread('F:\Program Files\MATLAB\R2016a\bin\1G.bmp');%读取原图像
 I = rgb2gray (bgm_) ; %转化为灰度图像
 ​
 se = strel('disk', 20) ; %圆形结构元素
 ​
 Io = imopen(I,se) ;%形态学开操作
 ​
 Ie = imerode(I, se);%对图像进行腐蚀
 ​
 Iobr = imreconstruct(Ie,I) ;%形态学重建
 ​
 Ioc=imclose(Io,se);%形态学关操作
 ​
 Iobrd = imdilate(Iobr, se) ; %对图像进行膨胀
 Iobrcbr = imreconstruct(imcomplement (Iobrd),imcomplement(Iobr)) ;%形态学重建
 Iobrcbr = imcomplement(Iobrcbr);%图像求反
 fgm = imregionalmax(Iobrcbr) ; %局部极大值
 %imshow(fgm)效果还行
 ​
 I2=I;
 I2(fgm) = 255;%局部极大值处像素值设置为255
 se2 = strel (ones(5,5));%结构元素
 fgm2 = imclose(fgm,se2);%关操作.
 fgm3 = imerode (fgm2, se2) ; %腐蚀
 fgm4 = bwareaopen (fgm3, 20) ;%开操作
 %imshow(fgm4) 效果一般
 ​
 I3=I;
 I3 (fgm4) = 255;%前景处设置为255 I3最好
 %imshow(I3)
 % bw = im2bw (Iobrcbr, graythresh (Iobrcbr)) ; %转化为二值图像
 bgm=im2bw(I3, 0.05)
 bgm_mask = uint8(bgm.*1);
 imshow(bgm_mask)
 ​
 red=imread('F:\Program Files\MATLAB\R2016a\bin\1R.bmp')
 red_gray= rgb2gray(red)%转灰度图像
 %imshow(red_gray)
 ​
 pm=sum(sum(red_gray.*bgm_mask)')%图像矩阵.*按位置相乘然后计算在图像G中R整幅图像的灰度值(荧光强度)
 pm_total = sum(sum(red_gray)')%计算R整幅图像的荧光强度
 r=pm/pm_total;%求比例

r为比例,pm为图R在图G中的荧光强度,pm_total是R整幅图像的荧光强度

 

膨胀扩展像素

相关函数及原理

  1. imdilate 功能:进行膨胀操作 用法: IM2 = imdilate(IM,SE)

    对灰度图像或二值图像IM进行膨胀操作,返回结果图像IM2。

    SE为由strel函数生成的结构元素对象。

  2. Strel 功能:构建形态学运算中的结构元素 用法: strel(shape,parameters)

    shape为形状参数,即设置什么样的结构元素;parameters为控制形状参数大小方向的参数。

    常用shape种类:

    'disk' 平面圆盘型

    'rectangle' 矩形

    'line' 线型

    'square' 正方形

  3. 用法:这里根据需要自己设定膨胀的大小,膨胀太大会引起失真

    s2=strel('disk',2)%圆盘半价为2的膨胀
     s20=strel('disk',20)%圆盘半价为20的膨胀
     s10=strel('disk',10)%圆盘半价为10的膨胀
     dilated_mask2=imdilate(I3,s2)
     dilated_mask10=imdilate(I3,s10)
     dilated_mask20=imdilate(I3,s20)

  4. 结果:

        

 

加入膨胀后求蛋白质含量Demo

 
bgm_ = imread('F:\Program Files\MATLAB\R2016a\bin\1G.bmp');%读取原图像
 I = rgb2gray (bgm_) ; %转化为灰度图像
 ​
 se = strel('disk', 20) ; %圆形结构元素
 ​
 Io = imopen(I,se) ;%形态学开操作
 ​
 Ie = imerode(I, se);%对图像进行腐蚀
 ​
 Iobr = imreconstruct(Ie,I) ;%形态学重建
 ​
 Ioc=imclose(Io,se);%形态学关操作
 ​
 Iobrd = imdilate(Iobr, se) ; %对图像进行膨胀
 Iobrcbr = imreconstruct(imcomplement (Iobrd),imcomplement(Iobr)) ;%形态学重建
 Iobrcbr = imcomplement(Iobrcbr);%图像求反
 fgm = imregionalmax(Iobrcbr) ; %局部极大值
 %imshow(fgm)效果还行
 ​
 I2=I;
 I2(fgm) = 255;%局部极大值处像素值设置为255
 se2 = strel (ones(5,5));%结构元素
 fgm2 = imclose(fgm,se2);%关操作.
 fgm3 = imerode (fgm2, se2) ; %腐蚀
 fgm4 = bwareaopen (fgm3, 20) ;%开操作
 %imshow(fgm4) 效果一般
 ​
 I3=I;
 I3 (fgm4) = 255;%前景处设置为255 I3效果最好
 ​
 s2=strel('disk',2)
 I3=imdilate(I3,s2)%将细胞膜外扩2个像素
 ​
 bgm=im2bw(I3, 0.05)
 bgm_mask = uint8(bgm.*1);
 imshow(bgm_mask)
 ​
 red=imread('F:\Program Files\MATLAB\R2016a\bin\1R.bmp')
 red_gray= rgb2gray(red)
 ​
 pm=sum(sum(red_gray.*bgm_mask)')
 pm_total = sum(sum(red_gray)')
 r=pm/pm_total;
 

 

与原始Demo相比,发现r值(比例值上升),表明膨胀操作有效

批量化处理

将所需要处理的.bmp后缀图片放到一个路径下,每次读取两张图片进行蛋白质含量比例测量,最后r值输出每次结果,out数组可看得见所有比对结果

 
file_list = dir(strcat('*.bmp'));     
 ​
 file_num = length(file_list);
 data_length = file_num/2;
 out = zeros(2, data_length); % 生成一个 2 * data_length 大小的矩阵
 ​
 for i = 1:2:file_num % 初值 步长 终值
     first = file_list(i).name; % 第一张
     second = file_list(i+1).name; % 第二张
     f= imread(strcat(first));
     s= imread(strcat(second));% 读取图片
     I= rgb2gray(f);
    
     s_g=rgb2gray(s);
     imshow(s_g)
     
     se = strel('disk', 20) ; %圆形结构元素
 ​
     Io = imopen(I,se) ;%形态学开操作
     Ie = imerode(I, se);%对图像进行腐蚀
     Iobr = imreconstruct(Ie,I) ;%形态学重建
     Ioc=imclose(Io,se);%形态学关操作
     Iobrd = imdilate(Iobr, se) ; %对图像进行膨胀
     Iobrcbr = imreconstruct(imcomplement (Iobrd),imcomplement(Iobr)) ;%形态学重建
     Iobrcbr = imcomplement(Iobrcbr);%图像求反
     fgm = imregionalmax(Iobrcbr) ; %局部极大值
 ​
     I2=I;
     I2(fgm) = 255;%局部极大值处像素值设置为255
     se2 = strel (ones(5,5));%结构元素
     fgm2 = imclose(fgm,se2);%关操作.
     fgm3 = imerode (fgm2, se2) ; %腐蚀
     fgm4 = bwareaopen (fgm3, 20) ;%开操作
     %imshow(fgm4) 效果一般
     I3=I;
     I3 (fgm4) = 255;%前景处设置为255 I3最好
 ​
     s2=strel('disk',2)
     I3=imdilate(I3,s2)
     bgm=im2bw(I3, 0.05)
     %imshow(bgm)
     bgm_mask = uint8(bgm.*1);%背景
     
     pm=sum(sum(s_g.*bgm_mask)')
     pm_total = sum(sum(s_g)')
     r=pm/pm_total;
     
     k = uint8(i/2)+1
     out(1, k) = r;
 end

 

结果与上面一致,程序运行无异常

背景去噪

博客:matlab——imadjust函数_一千种风的味道的博客-CSDN博客

t1=cputime
bgm_ = imread('F:\Program Files\MATLAB\R2016a\bin\4g.jpg');%读取原图像
I = rgb2gray (bgm_) ; %转化为灰度图像

se = strel('disk', 20) ; %圆形结构元素

Io = imopen(I,se) ;%形态学开操作

Ie = imerode(I, se);%对图像进行腐蚀

Iobr = imreconstruct(Ie,I) ;%形态学重建

Ioc=imclose(Io,se);%形态学关操作

Iobrd = imdilate(Iobr, se) ; %对图像进行膨胀
Iobrcbr = imreconstruct(imcomplement (Iobrd),imcomplement(Iobr)) ;%形态学重建
Iobrcbr = imcomplement(Iobrcbr);%图像求反
fgm = imregionalmax(Iobrcbr) ; %局部极大值
%imshow(fgm)效果还行

I2=I;
I2(fgm) = 255;%局部极大值处像素值设置为255
se2 = strel (ones(5,5));%结构元素
fgm2 = imclose(fgm,se2);%关操作.
fgm3 = imerode (fgm2, se2) ; %腐蚀
fgm4 = bwareaopen (fgm3, 20) ;%开操作
%imshow(fgm4) 效果一般

I3=I;
I3 (fgm4) = 255;%前景处设置为255 I3最好
%imshow(I3)
% bw = im2bw (Iobrcbr, graythresh (Iobrcbr)) ; %转化为二值图像
s2=strel('disk',2)
I3=imdilate(I3,s2)
bgm=im2bw(I3, 0.05)
bgm_mask = uint8(bgm.*1);
%imshow(bgm_mask)

red=imread('F:\Program Files\MATLAB\R2016a\bin\4r.jpg')
red_gray= rgb2gray(red)
%imshow(red_gray)

% pm=sum(sum(red_gray.*I3)')
% pm_total = sum(sum(pm)')
% r=pm/pm_total;

r_img= red_gray.*bgm_mask
subplot(1,3,1),imshow(r_img),title('开始的图像');
r_r_img=r_img
r_r_img=imadjust(r_r_img,[0.05;1],[0;1])%将低于0.03*25像素的值变为0 这里乘的系数0.03控制去噪的程度
r_r_img_=imadjust(r_r_img,[0.09;1],[0;1])%将低于0.09*25像素的值变为0
subplot(1,3,2),imshow(r_r_img),title('去噪的图像');  
subplot(1,3,3),imshow(r_r_img_),title('更去噪的图像'); 
%imshow(r_img)
pm=sum(sum(red_gray.*bgm_mask)')
pm_=sum(sum(r_r_img)')%计算去噪之后的灰度值

pm_total = sum(sum(red_gray)')
r=pm/pm_total;

t2=cputime
t=t2-t1%计算程序运行的时间

 

最终可膨胀可去噪后的求图像荧光强度值DEMo

file_list = dir(strcat('*.jpg'));     % 这里改后缀用于处理不同格式图片

file_num = length(file_list);
data_length = file_num/2;
out = zeros(2, data_length); % 生成一个 2 * data_length 大小的矩阵

for i = 1:2:file_num % 初值 步长 终值
    first = file_list(i).name; % 第一张
	second = file_list(i+1).name; % 第二张
    f= imread(strcat(first));
    s= imread(strcat(second));% 读取图片
    I= rgb2gray(f);
   
    s_g=rgb2gray(s);
    %imshow(s_g)
    
    se = strel('disk', 20) ; %圆形结构元素

    Io = imopen(I,se) ;%形态学开操作
    Ie = imerode(I, se);%对图像进行腐蚀
    Iobr = imreconstruct(Ie,I) ;%形态学重建
    Ioc=imclose(Io,se);%形态学关操作
    Iobrd = imdilate(Iobr, se) ; %对图像进行膨胀
    Iobrcbr = imreconstruct(imcomplement (Iobrd),imcomplement(Iobr)) ;%形态学重建
    Iobrcbr = imcomplement(Iobrcbr);%图像求反
    fgm = imregionalmax(Iobrcbr) ; %局部极大值

    I2=I;
    I2(fgm) = 255;%局部极大值处像素值设置为255
    se2 = strel (ones(5,5));%结构元素
    fgm2 = imclose(fgm,se2);%关操作.
    fgm3 = imerode (fgm2, se2) ; %腐蚀
    fgm4 = bwareaopen (fgm3, 20) ;%开操作
    %imshow(fgm4) 效果一般
    I3=I;
    I3 (fgm4) = 255;%前景处设置为255 I3最好
    %imshow(I3)
    % bw = im2bw (Iobrcbr, graythresh (Iobrcbr)) ; %转化为二值图像
    s2=strel('disk',2)
    I3=imdilate(I3,s2)
    bgm=im2bw(I3, 0.05)
    %imshow(bgm)
    bgm_mask = uint8(bgm.*1);%背景
    
    
    
    pm=sum(sum(s_g.*bgm_mask)')%pm值为图像的荧光强度灰度值
    r_img=s_g.*bgm_mask
    subplot(1,2,1),imshow(r_img),title('去噪前')
    r_r_img=imadjust(r_img,[0.08;1],[0;1])%将低于0.05*255像素的值变为0 这里乘的系数0.05控制去噪的程度
    subplot(1,2,2),imshow(r_r_img),title('去噪后')
    pm_=sum(sum(r_r_img)')%pm_值为去噪后图像的荧光强度灰度值
    pm_total = sum(sum(s_g)')
    r=pm/pm_total;
    
    k = uint8(i/2)+1
    out(1, k) = pm_;%out记录的就是所有的值
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值