【图像识别】细胞识别和边缘检测matlab源码

 

%%
%--------第一部分:对血液图片进行处理,提取图片中的红细胞的形态特征,实现红细胞计数--------%
close all;
clear all;
clc;
I = imread('bloodtest1.jpg');%读取血液图像

%将彩图转为灰度图
I = rgb2gray(I);        
figure(1);
imshow(I);
title('灰度处理后的细胞图像');

%平滑处理
h = fspecial('average',3); %3*3均值滤波模板
I = imfilter(I, h, 'replicate'); %重复填充边界
figure(2);
imshow(I);
title('平滑处理后的细胞图像');

%二值化处理
t = graythresh(I);        %计算阈值t
C = im2bw(I,t);           %根据阈值二值化图像
figure(3);
subplot(1,3,1),imshow(C);title('二值化处理后的细胞图像');

%边缘的红细胞的处理,避免将边缘的红细胞去除
[r,c] = size(C);
C(1,:) = 1;
C(:,1) = 1;
C(:,c) = 1;         
C(2,:) = 0;
C(:,2) = 0;
C(:,c-1) = 0; 
C = not(C);

%填充处理
D=imfill(C,8,'holes');%对处理后的红细胞进行填充处理
figure(3),subplot(1,3,2),imshow(C);title('第一步填充');
D = D - C;
D = imfill(D,8,'holes');
figure(3),subplot(1,3,3),imshow(D);title('第二步填充');

%去除无关杂质
[L,N] = bwlabel(D,8);     
s = regionprops(L,'Area');
F = bwareaopen(D,130,8);  %去除杂质,将面积小于130个像素点的区域删除。
[L,N] = bwlabel(F,8);     
figure,imshow(F);title('去除杂质后的填充疑似红细胞图像');

%坐标提取
B = bwboundaries(F);      %疑似红细胞边界提取
for g = 1:length(B)
    boundary = B{g};      %依次提取每个目标的边界
    Y = boundary(:,1);
    X = boundary(:,2);
    Ymax = max(Y);        %疑似红细胞上边界
    Ymin = min(Y);        %疑似红细胞下边界
    Xmax = max(X);        %疑似红细胞左边界
    Xmin = min(X);        %疑似红细胞右边界
    
    x(g) = floor((Xmax + Xmin)/2);%记录疑似红细胞的横坐标
    y(g) = floor((Ymax + Ymin)/2);%记录疑似红细胞的纵坐标 
end

%目标提取及显示
figure,imshow(I);title('识别得的红细胞');
for i = 1:g 
    rectangle('Position',[x(i)-21 y(i)-21 42 42],...
              'edgecolor','r','LineWidth',2); %显示红细胞框图
end

%%
%--------第二部分:对单个红细胞的截取以进行轮廓分析和边缘检测--------%

clear all;
clear
clc;

%选取要分析的单个疑似红细胞
figure();
A = imread('bloodtest1.jpg');
imshow(A);title('请确定两个点来截取所要分析的红细胞图像');
[x,y] = ginput(2);    %利用ginput函数确定图像上的两点,返回值是两点的坐标
pic_1 = imcrop(A,[x(1),y(1),abs(x(1)-x(2)),abs(y(1)-y(2))]);
%利用imcrop函数对图像进行切割,输入参数是一个定点坐标,
%从该定点出发向右abs(x(1)-x(2)),向下abs(y(1)-y(2))的区域进行切割
figure,imshow(pic_1);title('所截取的单个红细胞图像');
imwrite(pic_1,'bloodtest1_part.jpg');
imgsrc = imread('bloodtest1_part.jpg');
[y, x, dim] = size(imgsrc);

%转换为灰度图
if dim>1
    imgsrc = rgb2gray(imgsrc);
end
sigma = 1;
gausFilter = fspecial('gaussian', [3,3], sigma);
img= imfilter(imgsrc, gausFilter, 'replicate');

%显示Grayscale三维图像
zz = double(img);
[xx, yy] = meshgrid(1:x, 1:y);
figure()
    surf(yy, xx, zz);
    xlabel('y');
    ylabel('x');
    zlabel('Grayscale');
    title('所截取的单个红细胞轮廓边缘的三维示意图');
    axis tight 

%边缘检测
BW = im2bw(img,0.4);
IBW = ~BW;
F1 = imfill(IBW,'holes');
SE = ones(3);
F2 = imdilate(F1,SE,'same');
BW2 = bwperim(F2);

%显示所截取疑似红细胞的轮廓边缘
figure()    
    subplot(2,2,1);
        imshow(imgsrc);
        title('灰度处理后的所截取的疑似红细胞图像');
    subplot(2,2,2);
        imshow(img);%高斯滤波后
        title('高斯滤波后的截取细胞图像');
    subplot(2,2,3);
        ed = edge(img, 'canny', 0.5); %Matlab自带的canny边缘检测函数
        imshow(ed);
        title('Canny后的截取细胞图像');
    subplot(2,2,4);
        imshow(BW2);%边缘轮廓
        title('截取细胞图像的边缘检测');
        

【图像识别】细胞识别和边缘检测matlab源码_第1张图片【图像识别】细胞识别和边缘检测matlab源码_第2张图片

往期回顾>>>>>>

【图像识别】国外车牌识别

【图像识别】基于cnn卷积神经网络之验证码识别matlab源码

【图像识别】基于svm植物叶子疾病检测和分类

【图像识别】路面裂缝识别含GUI源码

【图像识别】基于RGB和BP神经网络的人民币识别系统含GUI界面

【图像识别】条形码识别系统

【图像识别】基于不变矩的数字验证码识别含GUI界面

【图像识别】基于模板匹配之手写数字识别系统GUI界面

【图像识别】基于贝叶斯分类器之目标识别matlab源码

【图像识别】身份证号码识别matlab源码

【图像识别】条形码识别系统

【图像分类】基于极限学习分类器对遥感图像分类

【图像识别】基于BP神经网络之字母识别matlab源码

你可能感兴趣的:(matlab,图像处理)