图像处理之仿油画效果

简介: 基于像素权重实现图像的像素模糊从而达到近似油画效果模糊 其实卷积的变种,不是基于Stroke维诺图算法与采样moment算法 模拟实现。不想跟多的废话了,先看效果: 说实话,货是干货,但是不想再多写罗嗦话,自己看代码吧!滤镜代码: package com.

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

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

}
最后:

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

目录
相关文章
|
30天前
Threejs制作骨骼模型
这篇文章详细介绍了在Three.js中创建骨骼动画的过程,包括骨骼节点的创建、权重设置以及控制骨骼关节实现动态效果的步骤,并通过一个具体的圆柱体模型演示了如何添加和控制骨骼动画。
22 2
|
3月前
|
API
|
5月前
|
数据安全/隐私保护 计算机视觉
图像处理之玻璃水印特效(祝大家圣诞节快乐)
图像处理之玻璃水印特效(祝大家圣诞节快乐)
41 8
|
5月前
|
算法 计算机视觉
图像处理之仿油画效果
图像处理之仿油画效果
23 0
|
5月前
|
算法 计算机视觉
图像处理之老照片特效
图像处理之老照片特效
26 0
|
5月前
|
算法 计算机视觉
图像处理之仿画笔效果一
图像处理之仿画笔效果一
24 0
|
文字识别 监控 算法
Baumer工业相机堡盟工业相机如何使用BGAPISDK联合Halcon将图像中的六一快乐字体提取出来(C#)
Baumer工业相机堡盟工业相机如何使用BGAPISDK联合Halcon将图像中的六一快乐字体提取出来(C#)
111 0
|
6月前
|
计算机视觉
Halcon 学习笔记八:颜色识别
Halcon 学习笔记八:颜色识别
493 0
|
机器学习/深度学习 监控 vr&ar
姿态识别、手势识别(附代码)
姿态识别、手势识别(附代码)
|
算法 Java 计算机视觉
模拟油画和铅笔画的滤镜效果
模拟油画和铅笔画的滤镜效果
153 0
模拟油画和铅笔画的滤镜效果