图像处理之仿画笔效果一

简介: 图像处理之仿画笔效果一 仿画笔效果最终完成自动完成从一张RGB图像到手工油画效果根据设定好的几个基本参数, 本文章解释算法的前半部分。完整的算法介绍参见这里: http://lvelho.impa.br/ip/papers/npar2000.pdf  StrokeAreas 本文的算法主要是通过输入像素计算Color Difference与moment值得到输出像素从而得到 图像上的画笔绘画区域(StrokeArea),需要输入的参数S决定中心像素p(x,y)的相邻区域的大 小。

图像处理之仿画笔效果一

仿画笔效果最终完成自动完成从一张RGB图像到手工油画效果根据设定好的几个基本参数,

本文章解释算法的前半部分。完整的算法介绍参见这里:

http://lvelho.impa.br/ip/papers/npar2000.pdf

 StrokeAreas

本文的算法主要是通过输入像素计算Color Difference与moment值得到输出像素从而得到

图像上的画笔绘画区域(StrokeArea),需要输入的参数S决定中心像素p(x,y)的相邻区域的大

小。整个处理流程本质是对输入图像的一个非线性高通滤波,结果是图像中频率越强的区域

输出越黑,频率越低的输出越白。

颜色差值(Color Difference):

表示两个像素点RGB颜色值之间的差值,计算差值采用欧几里德距离公式。

图像力矩(Image Moments),计算公式如下:

其中I为单色图像,否则RGB图像要分别代入RGB颜色分量

整个算法流程如下:

1.      根据输入图像生成一幅白色背景单色图像

2.      根据输入参数S计算出卷积区域大小

3.      对每个输入像素点完成卷积计算(注意是计算Color Difference)

4.      对输入像素点P0完成moment00计算

5.      归一化以后将输出像素输出到1中生成的图像对应(x,y)

 程序效果:


另外一幅图效果参数s为30时候:


StrokeArea算法代码:

@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, index2 = 0;
    int semiRow = (int)(size/2); 
	int semiCol = (int)(size/2);
	int newX, newY;
	
	// initialize the color RGB array with zero...
	int[] rgb = new int[3];
	int[] rgb2 = new int[3];
	for(int i=0; i<rgb.length; i++) {
		rgb[i] = rgb2[i] = 0;
	}
	
	// start the algorithm process here!!
    for(int row=0; row<height; row++) {
    	int ta = 0;
    	for(int col=0; col<width; col++) {
    		index = row * width + col;
    		ta = (inPixels[index] >> 24) & 0xff;
    		rgb[0] = (inPixels[index] >> 16) & 0xff;
    		rgb[1] = (inPixels[index] >> 8) & 0xff;
    		rgb[2] = inPixels[index] & 0xff;
            
            /* adjust region to fit in source image */
    		// color difference and moment Image
            double moment = 0.0d;
            for(int subRow = -semiRow; subRow <= semiRow; subRow++) {
            	for(int subCol = -semiCol; subCol <= semiCol; subCol++) {
            		newY = row + subRow;
            		newX = col + subCol;
            		if(newY < 0) {
            			newY = 0;
            		}
            		if(newX < 0) {
            			newX = 0;
            		}
            		if(newY >= height) {
            			newY = height-1;
            		}
            		if(newX >= width) {
            			newX = width - 1;
            		}
            		index2 = newY * width + newX;
            		rgb2[0] = (inPixels[index2] >> 16) & 0xff; // red
            		rgb2[1] = (inPixels[index2] >> 8) & 0xff; // green
            		rgb2[2] = inPixels[index2] & 0xff; // blue
            		moment += colorDiff(rgb, rgb2);
            	}
            }
            // calculate the output pixel value.
            int outPixelValue = clamp((int) (255.0d * moment / (size*size)));
            outPixels[index] = (ta << 24) | (outPixelValue << 16) | (outPixelValue << 8) | outPixelValue;
    	}
    }

    setRGB( dest, 0, 0, width, height, outPixels );
    return dest;
}
转载文章请务必注明出自本博客

目录
相关文章
|
2天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
13天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1286 5
|
12天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1318 87
|
1天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
175 82
2025年阿里云域名备案流程(新手图文详细流程)
|
1天前
|
自然语言处理 前端开发
基于Electron38+Vite7.1+Vue3+Pinia3+ElementPlus电脑端admin后台管理模板
基于最新版跨平台框架Electron38整合Vite7+Vue3+ElementPlus搭建轻量级客户端中后台管理系统解决方案。
152 86