|
- clc,clear,close all
- warning off;
- % [filename,pathname]=uigetfile({'*.jpg';'*.bmp';'*.tif'},'选择图片'); %选择不同格式下的图片
- % str=[pathname,filename]; %图像名称
- % 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,[3,2]);
- % 二值化分割
- threshold = graythresh(ImageGray);
- bw = im2bw(ImageGray,threshold);
- imshow(bw)
- %% 形态学操作
- se = strel('rectangle',[2,2]);
- 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',[3,3]);
- bw = imclose(bw,se); % 闭运算
- bw = imopen(bw,se); % 开运算
- imshow(bw)
- % 连通域检测,计算特征
- cc = bwconncomp(~bw); % 连通域操作
- stats = regionprops(~bw,'all'); % 提取二值化块的所有特征
- N = cc.NumObjects; % 晶粒个数
- Area = sum( [stats.Area] ); % 面积
- Perimeter = sum( [stats.Perimeter] ); % 周长
- MajorAxisLength = mean( [stats.MajorAxisLength] ); % 长轴长
- MinorAxisLength = mean( [stats.MinorAxisLength] ); % 短轴长
- 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); %关闭文件
- % % 二值化区域边界分割
- % [B_regions, Label] = bwboundaries(bw,'noholes');
- % Label_rgb = label2rgb(Label,'jet',[.5 .5 .5]);
- % imshow(Label_rgb)
- %%
- % [L, rgb] = watershed_segmentation(bw);
- % Label_rgb = label2rgb(L,'jet',[.5 .5 .5]);
- % imshow(Label_rgb)
- %%
- % id = find( [stats.Solidity]<thre ); % 矩形度小于thre的,全部输出
- % for i=1:length(id)
- % bw(labelmatrix(cc)==id(i))=0; % 剔除矩形度小于thre的所有二值化块
- % end
复制代码 分水岭分割参考:分水岭分割算法
|
|