图像处理之仿油画效果

简介: 图像处理之仿油画效果

基于像素权重实现图像的像素模糊从而达到近似油画效果模糊

其实卷积的变种,不是基于Stroke维诺图算法与采样moment算法

模拟实现。不想跟多的废话了,先看效果:

说实话,货是干货,但是不想再多写罗嗦话,自己看代码吧!滤镜代码:

package com.gloomyfish.nature.filter.study;
 
import java.awt.image.BufferedImage;
 
import com.gloomyfish.filter.study.AbstractBufferedImageOp;
 
public class OilPaintFilter extends AbstractBufferedImageOp {
 
  private int radius = 5; // default value
  private int intensity = 20; // default value
 
  public OilPaintFilter(int radius, int graylevel) {
    this.radius = radius;
    this.intensity = graylevel;
  }
 
  public OilPaintFilter() {
    this(5, 20);
  }
 
  public int getRadius() {
    return radius;
  }
 
  public void setRadius(int radius) {
    this.radius = radius;
  }
 
  public int getIntensity() {
    return intensity;
  }
 
  public void setIntensity(int intensity) {
    this.intensity = intensity;
  }
 
  @Override
  public BufferedImage filter(BufferedImage src, BufferedImage dest) {
    int width = src.getWidth();
        int height = src.getHeight();
 
        if ( dest == null )
          dest = createCompatibleDestImage( src, null );
 
        int[] inPixels = new int[width*height];
        int[] outPixels = new int[width*height];
        getRGB( src, 0, 0, width, height, inPixels );
        int index = 0;
        int subradius = this.radius / 2;
        int[] intensityCount = new int[intensity+1];
        int[] ravg = new int[intensity+1];
        int[] gavg = new int[intensity+1];
        int[] bavg = new int[intensity+1];
        for(int i=0; i<=intensity; i++)
        {
          intensityCount[i] = 0;
          ravg[i] = 0;
          gavg[i] = 0;
          bavg[i] = 0;
        }
        for(int row=0; row<height; row++) {
          int ta = 0, tr = 0, tg = 0, tb = 0;
          for(int col=0; col<width; col++) {
            
            for(int subRow = -subradius; subRow <= subradius; subRow++)
            {
              for(int subCol = -subradius; subCol <= subradius; subCol++)
              {
                int nrow = row + subRow;
                int ncol = col + subCol;
                if(nrow >=height || nrow < 0)
                {
                  nrow = 0;
                }
                if(ncol >= width || ncol < 0)
                {
                  ncol = 0;
                }
                index = nrow * width + ncol;
                      tr = (inPixels[index] >> 16) & 0xff;
                      tg = (inPixels[index] >> 8) & 0xff;
                      tb = inPixels[index] & 0xff;
                      int curIntensity = (int)(((double)((tr+tg+tb)/3)*intensity)/255.0f);
                  intensityCount[curIntensity]++;
                  ravg[curIntensity] += tr;
                  gavg[curIntensity] += tg;
                  bavg[curIntensity] += tb;
              }
            }
            
            // find the max number of same gray level pixel
            int maxCount = 0, maxIndex = 0;
            for(int m=0; m<intensityCount.length; m++)
            {
              if(intensityCount[m] > maxCount)
              {
                maxCount = intensityCount[m];
                maxIndex = m;
              }
            }
            
            // get average value of the pixel
            int nr = ravg[maxIndex] / maxCount;
            int ng = gavg[maxIndex] / maxCount;
            int nb = bavg[maxIndex] / maxCount;
            index = row * width + col;
            outPixels[index] = (ta << 24) | (nr << 16) | (ng << 8) | nb;
            
            // post clear values for next pixel
                for(int i=0; i<=intensity; i++)
                {
                  intensityCount[i] = 0;
                  ravg[i] = 0;
                  gavg[i] = 0;
                  bavg[i] = 0;
                }
                
          }
        }
        setRGB( dest, 0, 0, width, height, outPixels );
        return dest;
  }
 
}

最后:

祝各位新春快乐,阖家欢乐!谢谢过去一年你们对本博客的关注与支持!

相关文章
|
1月前
ThreeJs制作全息投影视频
这篇文章介绍了使用Three.js来创建全息投影效果的视频教程,涵盖了实现全息效果的技术要点和具体实施步骤。
40 2
ThreeJs制作全息投影视频
|
5月前
|
数据安全/隐私保护 计算机视觉
图像处理之玻璃水印特效(祝大家圣诞节快乐)
图像处理之玻璃水印特效(祝大家圣诞节快乐)
41 8
|
5月前
|
算法 计算机视觉
图像处理之仿画笔效果一
图像处理之仿画笔效果一
25 0
|
5月前
|
算法 计算机视觉
图像处理之老照片特效
图像处理之老照片特效
27 0
|
机器学习/深度学习 监控 vr&ar
姿态识别、手势识别(附代码)
姿态识别、手势识别(附代码)
|
算法 数据处理 计算机视觉
砥砺的前行|基于labview的机器视觉图像处理(七)——图像双边处理自适应亮度
砥砺的前行|基于labview的机器视觉图像处理(七)——图像双边处理自适应亮度
154 0
砥砺的前行|基于labview的机器视觉图像处理(七)——图像双边处理自适应亮度
|
算法 计算机视觉
项目实战:Qt+OpenCV激光射击游戏(识别激光、识别圆)
项目实战:Qt+OpenCV激光射击游戏(识别激光、识别圆)
项目实战:Qt+OpenCV激光射击游戏(识别激光、识别圆)
|
算法
图像滤镜艺术---最新美颜算法研究
原文:图像滤镜艺术---最新美颜算法研究 本文所讲的美颜算法主要指磨皮+美白+肤色+清晰度; 磨皮算法主要有两大类:①基于高反差保留的磨皮算法;②基于保边滤波器的磨皮算法; 对于高反差保留磨皮算法,具体过程如:点击打开链...
4225 0
|
机器学习/深度学习 网络架构
超酷的神经网络合成动物运动动画,解救动画师!(代码开源+视频)
针对四足动物的动画生成问题,爱丁堡大学的研究人员开发了一个被称为“模式自适应神经网络”的新神经网络架构,它可以从实际的运动数据学习,生成非常自然的动画。团队在今天开源了所有代码、数据和编译的demo。
2212 0
|
算法 Android开发
图像滤镜艺术---图像滤镜晕影调节算法研究
原文:图像滤镜艺术---图像滤镜晕影调节算法研究 本文对滤镜中常见的晕影,晕角效果的实现做了研究,具体如下: 1 晕影调整算法 所谓晕影就是给图像四个角添加暗影效果,这暗影向图像中心逐渐淡化。我们使用如下公式来实现: 假设图像宽度高度分别为w,h: double d = Math.
1151 0