zoukankan      html  css  js  c++  java
  • 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),[]);

    原图:

    结果:

  • 相关阅读:
    GIT
    JS常用功能
    prop checkbox 是否选中的问题。
    关于 未能加载文件或程序集“MySql.Web.v20 ...... 的问题
    Codeforces Round #535(div 3) 简要题解
    [Codeforces 600E] Lomsat gelral
    [PA 2011] Journeys
    [HNOI 2012] 永无乡
    [ONTAK2010] Peaks
    [BZOJ 3307] 雨天的尾巴
  • 原文地址:https://www.cnblogs.com/tiandsp/p/12726633.html
Copyright © 2011-2022 走看看