論程序員如何畫水粉畫

思路:圖像分割

算法:meanshift

參數:半徑爲r=2

代碼:

clear all;
close all;
clc;
filename = dir('flower\*.jpg');
for nn = 2 : length(filename)
    fullname = strcat('flower\', filename(nn).name);
    r=2;        %濾波半徑
    img=imread(fullname);
    img1 = img(:,:,1);
    img2 = img(:,:,2);
    img3 = img(:,:,3);
    re = zeros(size(img));
    for kk = 1 : 3
        if kk == 1
            img = img1;
        end
        if kk == 2
            img = img2;
        end
        if kk == 3
            img = img3;
        end
        img=double(img);
        [m n]=size(img);
        imgn=zeros(m+2*r+1,n+2*r+1);

        imgn(r+1:m+r,r+1:n+r)=img;
        imgn(1:r,r+1:n+r)=img(1:r,1:n); 
        imgn(1:m+r,n+r+1:n+2*r+1)=imgn(1:m+r,n:n+r);
        imgn(m+r+1:m+2*r+1,r+1:n+2*r+1)=imgn(m:m+r,r+1:n+2*r+1);
        imgn(1:m+2*r+1,1:r)=imgn(1:m+2*r+1,r+1:2*r);
        %imshow(mat2gray(imgn))

        for i=1+r:m+r
            for j=1+r:n+r
                ser=imgn(i-r:i+r,j-r:j+r);
                ser=reshape(ser,[1 (2*r+1)^2]);         %將二維模板變爲一維
                imgn(i,j)=mean_shift(ser,2*r^2+2*r+1);   %取模板最中間的那個值作爲迭代初值

            end    
        end
        imgn=imgn(r+1:m+r,r+1:n+r);
        re(:,:,kk) = imgn;

    end
    re = uint8(re);
    imwrite(re,strcat('flower\processed', filename(nn).name),'jpg')
end

效果截圖


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章