%%
%--------第一部分:对血液图片进行处理,提取图片中的红细胞的形态特征,实现红细胞计数--------%
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('截取细胞图像的边缘检测');