输入一张图像,输出任意前n大的连通域图像

2019-04-15 16:25发布

经常遇到一个问题,即输出一幅图像的最大连通域图像。在解决这个问题之后,写了一个输出任意前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超过了连通域的数目时,输出所有已有的连通域。