本文共 4875 字,大约阅读时间需要 16 分钟。
通过编程实现图像分割,将彩色图像分割为若干个同质区域。采用K-means聚类算法,将像素分组实现图像分割。分别基于颜色特征和纹理特征进行实验,分析两种视觉特征在图像分割中的性能。
实验设计包含4个功能函数,分别实现图像分割的不同方面。
函数说明:
代码展示:
function [labelIm] = quantizeFeats(featIm, meanFeats) height = size(featIm, 1); width = size(featIm, 2); dimension = size(featIm, 3); labelIm = ones(height, width); for h = 1:height for w = 1:width minDis = -1; for k = 1:size(meanFeats, 1) dis = 0; for d = 1:dimension dis = dis + pow(featIm(h, w, d) - meanFeats(k, d), 2); end dis = sqrt(dis); if minDis < 0 || dis < minDis labelIm(h, w) = k; minDis = dis; end end end endend
函数说明:
代码展示:
function [textons] = createTextons(imStack, bank, k) [row, col] = size(imStack); bankNum = size(bank, 3); textonsData = []; for i = 1:row for j = 1:col im = imStack{i, j}; im = im2double(im); responses = zeros(size(im, 1), size(im, 2), bankNum); for r = 1:bankNum responses(:,:,r) = conv2(im, double(bank(:,:,r)), 'same'); end X = reshape(responses, size(responses, 1)*size(responses, 2), bankNum); Xrow = size(X, 1); ranX = X(randperm(Xrow, ceil(Xrow/1000))); textonsData = [textonsData; ranX]; end end [~, textons] = kmeans(textonsData, k);end
函数说明:
代码展示:
function [featIm] = extractTextonHists(origIm, bank, textons, winSize) origIm = im2double(origIm); [row, col] = size(origIm); bankNum = size(bank, 3); responses = zeros(row, col, bankNum); for r = 1:bankNum responses(:,:,r) = conv2(origIm, double(bank(:,:,r)), 'same'); end X = reshape(responses, size(responses, 1)*size(responses, 2), bankNum); dis2textons = dist2(textons, X); [~, indxtexton] = max(dis2textons); feattexton = reshape(indxtexton, row, col); if winSize > 1 colNumLeft = floor((winSize-1)/2); colNumRight = ceil((winSize-1)/2); for i = 1:colNumLeft feattexton = [feattexton(:, 1:end)]; end for i = 1:colNumRight feattexton = [feattexton; feattexton(1:end, :)]; end end featIm = zeros(row, col, size(textons, 1)); for i = (1+colNumLeft):size(feattexton, 1)-colNumRight for j = (1+colNumLeft):size(feattexton, 2)-colNumRight window = feattexton((i-colNumLeft): (i+colNumRight), (j-colNumLeft): (j+colNumRight)); frequency = tabulate(window(:)); for k = 1:size(frequency, 1) textonIndex = int64(frequency(k, 1)); count = int32(frequency(k, 2)); featIm(i-colNumLeft, j-colNumLeft, textonIndex) = featIm(i-colNumLeft, j-colNumLeft, textonIndex)+count; end end endend
函数说明:
代码展示:
function [colorLabelIm, textureLabelIm] = compareSegmentations(origIm, bank, textons, winSize, numColorRegions, numTextureRegions) origIm = im2double(origIm); % 颜色分割 colordata = reshape(origIm, size(origIm, 1)*size(origIm, 2), size(origIm, 3)); opts = statset('Display', 'final', 'MaxIter', 1000); [~, colorCenter] = kmeans(colordata, numColorRegions, 'Options', opts); colorLabelIm = quantizeFeats(origIm, colorCenter); % 纹理分割 grayIm = rgb2gray(origIm); featIm = extractTextonHists(grayIm, bank, textons, winSize); featImData = reshape(featIm, size(featIm, 1)*size(featIm, 2), size(featIm, 3)); [~, textureCenter] = kmeans(featImData, numTextureRegions, 'Options', opts); textureLabelIm = quantizeFeats(featIm, textureCenter); return;end
通过实验分析,观察不同参数对图像分割效果的影响。以下是一些关键发现:
颜色分割参数调整:
纹理分割参数调整:
纹理编码集计算方法:
窗口大小的影响:
通过以上实验,可以看出K-means聚类算法对图像分割的敏感性,合理的参数选择和适当的特征提取方法能显著提升分割效果。
转载地址:http://mkdi.baihongyu.com/