matlab練習程序(油畫效果)


油畫效果算法有兩個參數,一個是濾波半徑r,一個是量化位數q。

算法原理:

1. 首先根據量化位數將0-255划分為q個區間;

2. 然后根據濾波半徑r拿到半徑內的像素;

3. 統計像素在區間中出現的次數,找到次數最大的區間;

4. 計算次數最大區間所有像素平均值賦值給當前濾波像素即可。

matlab代碼如下:

clear all;
close all;
clc;

r=1;       %濾波半徑
q=8;       %量化位數
img=imread('lena.jpg');

[m,n]=size(img);
imshow(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)=flipud(img(1:r,1:n));                             %擴展上邊界
imgn(1:m+r,n+r+1:n+2*r+1)=fliplr(imgn(1:m+r,n:n+r));                %擴展右邊界
imgn(m+r+1:m+2*r+1,r+1:n+2*r+1)=flipud(imgn(m:m+r,r+1:n+2*r+1));    %擴展下邊界
imgn(1:m+2*r+1,1:r)=fliplr(imgn(1:m+2*r+1,r+1:2*r));                %擴展左邊界

re=imgn;
for i=r+1:m+r
    for j=r+1:n+r    
        w=imgn(i-r:i+r,j-r:j+r);        
        W=w(:);
        
        buckets = cell(q+1,1);
        bucketind = zeros(q+1,1);
        for k=1:length(W)
            ind = floor(W(k)*q/255)+1;
            buckets{ind}=[buckets{ind};W(k)];
            bucketind(ind) = bucketind(ind)+1;
        end
        
        [~,ind] = max(bucketind);           %得到buckets中數最多的序號
        re(i,j) = mean(buckets{ind});       
               
    end   
end

figure;
imshow(re(r+1:m+r,r+1:n+r),[]);

原圖:

結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM