二值化特征(面积、椭圆长短轴、周长)、连通域检测
clc,clear,close allwarning off;
% =uigetfile({'*.jpg';'*.bmp';'*.tif'},'选择图片'); %选择不同格式下的图片
% str=; %图像名称
% Image =imread(str); %加载该图像
Image =imread('jinx.jpg'); %加载该图像
% Image =imread('1.jpg'); %加载该图像
% 获取灰度图像
if size(Image,3)>1
ImageGray = rgb2gray(Image); % 转化为灰度图像
else
ImageGray = Image;
end
% 中值滤波
ImageGray = medfilt2(ImageGray,);
% 二值化分割
threshold = graythresh(ImageGray);
bw = im2bw(ImageGray,threshold);
imshow(bw)
%% 形态学操作
se = strel('rectangle',);
for i=1:2
bw = imerode(bw,se);
end
imshow(bw)
for i=1:2
bw = imdilate(bw,se);
end
% 移除对象
bw = bwareaopen(bw,100);% 去掉面积小于100的小块
se = strel('rectangle',);
bw = imclose(bw,se); % 闭运算
bw = imopen(bw,se); % 开运算
imshow(bw)
% 连通域检测,计算特征
cc = bwconncomp(~bw); % 连通域操作
stats = regionprops(~bw,'all'); % 提取二值化块的所有特征
N = cc.NumObjects; % 晶粒个数
Area = sum( ); % 面积
Perimeter = sum( ); % 周长
MajorAxisLength = mean( ); % 长轴长
MinorAxisLength = mean( ); % 短轴长
Area_ratio = Area/size(bw,1)/size(bw,2); % 面积分数
Area_mean = Area/N; % 平均面积
Perimeter_mean = Perimeter/N; % 平均周长
fid=fopen('result.txt','wt'); % 打开文件
fprintf(fid,'%s','面积 周长 长轴长 短轴长 面积分数 平均面积 平均周长');
fprintf(fid,'\n');
fprintf(fid,'%3.4f ',Area);% 输入数据
fprintf(fid,'%3.4f ',Perimeter);% 输入数据
fprintf(fid,'%3.4f ',MajorAxisLength);% 输入数据
fprintf(fid,'%3.4f ',MinorAxisLength);% 输入数据
fprintf(fid,'%3.4f ',Area_ratio);% 输入数据
fprintf(fid,'%3.4f ',Area_mean);% 输入数据
fprintf(fid,'%3.4f ',Perimeter_mean);% 输入数据
fprintf(fid,'\n');
fclose(fid); %关闭文件
% % 二值化区域边界分割
% = bwboundaries(bw,'noholes');
% Label_rgb = label2rgb(Label,'jet',[.5 .5 .5]);
% imshow(Label_rgb)
%%
% = watershed_segmentation(bw);
% Label_rgb = label2rgb(L,'jet',[.5 .5 .5]);
% imshow(Label_rgb)
%%
% id = find( <thre );% 矩形度小于thre的,全部输出
% for i=1:length(id)
% bw(labelmatrix(cc)==id(i))=0; % 剔除矩形度小于thre的所有二值化块
% end分水岭分割参考:分水岭分割算法
%% CT切片
clc,clear,close all
file_path ='./试件/';% 图像文件夹路径
img_path_list = dir(strcat(file_path,'*.jpg')); % 获取该文件夹中所有bmp格式的图像
img_num = length(img_path_list);% 获取图像总数量
if img_num > 0 % 有满足条件的图像
k=1;
for j = 1 : 2 : img_num % 逐一读取图像
image_name = img_path_list(j).name; % 图像名
fprintf('正在处理的图像: %d %s\n',j,strcat(file_path,image_name));% 显示正在处理的图像名
img =imread(strcat(file_path,image_name));
if size(img,3)>1
img = rgb2gray(img);
end
img = imresize(img,);% 缩小处理
bw=img>10;
% 连通域检测,计算特征
cc = bwconncomp(bw); % 连通域操作
s= regionprops(cc, {'centroid','area'});% 面积特征
= max(); % 面积最大
bw(labelmatrix(cc)~=id)=0; % 只保留最大二值化块
bw = bwfill(bw,'holes'); % 填充孔洞
img1 = immultiply(img,bw); % 交运算
D(:,:,k) = img1;
k=k+1;
end
end
%% CT重建
= reducevolume(D,);
D = smooth3(D);
p1 = patch(isosurface(x,y,z,D, 5,'verbose'),...
'FaceColor','g','EdgeColor','none');
isonormals(x,y,z,D,p1);
p2 = patch(isocaps(x,y,z,D, 5),...
'FaceColor','interp','EdgeColor','none');
view(3);
axis tight;
daspect();
colormap(gray(100));
camlight;
lighting gouraud;
求解最大的二值化区域图,:
%% 图像二值化处理
bw = imG<190; % 图像二值化处理
figure(2),imshow(bw)
bw1 = bwareaopen(bw,20); % 去除面积小于20的块
figure(2),imshow(bw1)
bw2 = imfill(bw1,'holes');% 填充空洞
figure(2),imshow(bw2)
cc = bwconncomp(bw2); % 连通域检查
stats = regionprops(bw2,'area'); % 提取二值化块的所有特征
id = find( == max()); % 求最大连通域的索引
bw2(labelmatrix(cc)~=id)=0; % 提取二值图像中最大连通区域
figure(2),imshow(bw2)
bw3 = bw2.*bw1; % 交运算
figure(2),imshow(bw3)
页:
[1]