图像处理之仿油画效果

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

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

其实卷积的变种,不是基于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;
  }
 
}

最后:

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

相关文章
|
缓存 数据挖掘 计算机视觉
砥砺的前行|基于labview的机器视觉图像处理|NI Vision Assisant(五)——Grayscale(灰度图) 功能
砥砺的前行|基于labview的机器视觉图像处理|NI Vision Assisant(五)——Grayscale(灰度图) 功能
318 0
砥砺的前行|基于labview的机器视觉图像处理|NI Vision Assisant(五)——Grayscale(灰度图) 功能
|
23天前
|
算法 计算机视觉
图像处理之仿画笔效果一
图像处理之仿画笔效果一
12 0
|
23天前
|
算法 计算机视觉
图像处理之老照片特效
图像处理之老照片特效
12 0
|
1月前
|
XML 算法 计算机视觉
使用OpenCV进行人脸检测和戴墨镜特效实战(附Python源码)
使用OpenCV进行人脸检测和戴墨镜特效实战(附Python源码)
196 1
|
1月前
|
算法 API 计算机视觉
【OpenCV】- 模板匹配(浩瀚星空只为寻找那一抹明月)
【OpenCV】- 模板匹配(浩瀚星空只为寻找那一抹明月)
|
机器学习/深度学习 机器人 vr&ar
照片转视频,像航拍一样丝滑,NeRF原班人马打造Zip-NeRF(1)
照片转视频,像航拍一样丝滑,NeRF原班人马打造Zip-NeRF
294 0
照片转视频,像航拍一样丝滑,NeRF原班人马打造Zip-NeRF(1)
|
编解码 算法 数据可视化
照片转视频,像航拍一样丝滑,NeRF原班人马打造Zip-NeRF(2)
照片转视频,像航拍一样丝滑,NeRF原班人马打造Zip-NeRF
241 0
|
机器学习/深度学习 监控 vr&ar
姿态识别、手势识别(附代码)
姿态识别、手势识别(附代码)
543 0
|
数据挖掘 计算机视觉
砥砺的前行|基于labview的机器视觉图像处理|NI Vision Assisant(四)——Color(彩色图) 功能(下)
砥砺的前行|基于labview的机器视觉图像处理|NI Vision Assisant(四)——Color(彩色图) 功能(下)
197 0
砥砺的前行|基于labview的机器视觉图像处理|NI Vision Assisant(四)——Color(彩色图) 功能(下)
|
缓存 数据挖掘 计算机视觉
砥砺的前行|基于labview的机器视觉图像处理|NI Vision Assisant(四)——Color(彩色图) 功能(上)
砥砺的前行|基于labview的机器视觉图像处理|NI Vision Assisant(四)——Color(彩色图) 功能(上)
174 0
砥砺的前行|基于labview的机器视觉图像处理|NI Vision Assisant(四)——Color(彩色图) 功能(上)