Halcom 发表于 2017-7-15 20:01:12

二值化特征(面积、椭圆长短轴、周长)、连通域检测

clc,clear,close all
warning 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分水岭分割参考:分水岭分割算法


Halcom 发表于 2017-10-11 21:42:41

%% 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;

Halcom 发表于 2018-3-24 23:12:37

求解最大的二值化区域图,:
%% 图像二值化处理
    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]
查看完整版本: 二值化特征(面积、椭圆长短轴、周长)、连通域检测