经常遇到一个问题,即输出一幅图像的最大连通域图像。在解决这个问题之后,写了一个输出任意前n大连通域图像的代码(n小于连通域总数)。如下所示:
close all;
clear;
clc;
pic = imread('pout.tif'); % 输入图像,这是一张灰度图像
% pic = imread('kobi.png'); % 输入图像,这是一张彩 {MOD}图像
if ndims(pic) == 3 % 如果输入的是彩 {MOD}图像,则将彩 {MOD}图像转换为灰度图像
I = rgb2gray(pic);
else
I = pic;
end
level = graythresh(I); % 采用OTSU算法做二值化
I1 = imbinarize(I, level);
L = bwlabel(I1); % 标记连通域
stats = regionprops(L, 'Area'); % 提取连通域面积大小
[~, index] = sort([stats.Area], 'descend'); % 降序排列
n = input('输入一个数字:');
if length(stats) > n
I2 = ismember(L, index(1:n)); % 如果stats的长度大于这个数字,则保存前m大连通域
else
I2 = L; % 如果stats的长度小于这个数字,则输出原所有连通域,不做改变
end
figure;
subplot(131), imshow(pic);
subplot(132), imshow(I1);
subplot(133), imshow(I2);
当输入n=1时:
当输入n=2时:
当输入n=5时:
以此类推,当输入的n超过了连通域的数目时,输出所有已有的连通域。