图像处理之应用卷积– 轧花与边缘检测

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 关于什么是卷积,如何理解卷积 参见这里: http://blog.csdn.net/jia20003/article/details/7038938 一:轧花 轧花算子(embossfilter) 对一幅数字图像一阶微分结果即可得到轧花效果,根据不同的算子,轧花又 可以分为凹效果与凸效果两种。

关于什么是卷积,如何理解卷积 参见这里:

http://blog.csdn.net/jia20003/article/details/7038938

一:轧花

轧花算子(embossfilter)

对一幅数字图像一阶微分结果即可得到轧花效果,根据不同的算子,轧花又

可以分为凹效果与凸效果两种。两个个最简单的轧花算子为:


轧花算子又称为双极性算子,1对图像的贡献意味着平滑,-1对图像的贡献

意味着突出细节,于是最终就得出了双极性的轧花效果。

 

处理过程:

a.      读取图像像素

b.      使用轧花算子完成对像素数组的卷积操作

c.      整体亮度提升效果– 高斯亮度/基于阈值/直接常量提升

 

轧花滤镜效果:左边为原图, 右边为轧花处理以后效果

 

二:边缘提取

Edge detection是图像处理中非常重要而且也是十分常用的图像处理手段之一,边缘提取是

图像二值化的基本步骤之一。边缘提取从本质上来说是高通滤波,从数字信号的角度看,就

是要保留高频信号,去掉低频信号,因此边缘提取有很多频率域算子,将图像完成FFT之后

在频率域完成高通滤波再转到空间域。显然计算量比较大,空间域最经典的边缘提取算法之

一Candy Edge Detection有着非常好的效果。

 

这里只是抛砖引玉,完成一个最简单基于卷积的空间域边缘提取算子,算子为:

 

完成卷积以后的效果如下:


对于灰度图完成边缘提取以后效果如下:

 

基于卷积还可以完成图像的锐化(Sharp Filter),让图像上的差异更加明显。

一个简单的Sharp Filter可以为

 

得到的效果如下:

 

完成轧花卷积的代码如下:

	@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];
        src.getRGB( 0, 0, width, height, inPixels, 0, width );
		int index = 0;
		int index2 = 0;
		int r=0, g=0, b=0;
		for ( int y = 0; y < height; y++ ) {
			for ( int x = 0; x < width; x++ ) {
				int ta = 255, tr = 0, tg = 0, tb = 0;
				for(int fr = 0; fr < filterRow; fr++) {
					int rowoffset = y + fr;
					if(rowoffset < 0 || rowoffset >=height) {
						rowoffset = y;
					}
					for(int fc = 0; fc < filterCol; fc++) {
						int coloffset = fc + x;
						if(coloffset < 0 || coloffset >= width) {
							coloffset = x;
						}
						index2 = rowoffset * width + coloffset;
						int rgb1 = inPixels[index2];
						int r1 = (rgb1 >> 16) & 0xff;
						int g1 = (rgb1 >> 8) & 0xff;
						int b1 = rgb1 & 0xff;
						if(isOUT) {
							tr += r1 * outfilter[fr][fc];
							tg += g1 * outfilter[fr][fc];
							tb += b1 * outfilter[fr][fc];
						} else {
							tr += r1 * infilter[fr][fc];
							tg += g1 * infilter[fr][fc];
							tb += b1 * infilter[fr][fc];
						}
					}
				}
				
				tr += COLORCONSTANTS;
				tg += COLORCONSTANTS;
				tb += COLORCONSTANTS;
				r = PixelUtils.clamp(tr);
				g = PixelUtils.clamp(tg);
				b = PixelUtils.clamp(tb);
				outPixels[index] = (ta << 24) | (r << 16) | (g << 8) | b;
				index++;
			}
		}
        dest.setRGB( 0, 0, width, height, outPixels, 0, width );
        return dest;
	}

完成简单边缘检测的代码如下:

	private void filter(int[] inPixels, int[] outPixels, int height, int width, double[][] filterKernel) {
		int index = 0;
		int index2 = 0;
		int r=0, g=0, b=0;
		int semiColumn = filterKernel.length/2;
		int semiRow = filterKernel[0].length/2;
		for ( int y = 0; y < height; y++ ) {
			for ( int x = 0; x < width; x++ ) {
				int ta = 255, tr = 0, tg = 0, tb = 0;
				for(int fr = -semiRow; fr <= semiRow; fr++) {
					int rowoffset = y + fr;
					if(rowoffset < 0 || rowoffset >=height) {
						rowoffset = y;
					}
					for(int fc = -semiColumn; fc <= semiColumn; fc++) {
						int coloffset = fc + x;
						if(coloffset < 0 || coloffset >= width) {
							coloffset = x;
						}
						index2 = rowoffset * width + coloffset;
						int rgb1 = inPixels[index2];
						int r1 = (rgb1 >> 16) & 0xff;
						int g1 = (rgb1 >> 8) & 0xff;
						int b1 = rgb1 & 0xff;
						tr += ((double)r1 * filterKernel[fr + semiRow][fc + semiColumn]);
						tg += ((double)g1 * filterKernel[fr + semiRow][fc + semiColumn]);
						tb += ((double)b1 * filterKernel[fr + semiRow][fc + semiColumn]);
					}
				}
				
				if(enhanceBrightness) {
					tr += COLORCONSTANTS;
					tg += COLORCONSTANTS;
					tb += COLORCONSTANTS;
				}
				r = PixelUtils.clamp(tr);
				g = PixelUtils.clamp(tg);
				b = PixelUtils.clamp(tb);
				outPixels[index] = (ta << 24) | (r << 16) | (g << 8) | b;
				index++;
			}
		}
	}

相关实践学习
【AI破次元壁合照】少年白马醉春风,函数计算一键部署AI绘画平台
本次实验基于阿里云函数计算产品能力开发AI绘画平台,可让您实现“破次元壁”与角色合照,为角色换背景效果,用AI绘图技术绘出属于自己的少年江湖。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
目录
相关文章
|
机器学习/深度学习 人工智能 监控
理解LLMOps: Large Language Model Operations
理解LLMOps: Large Language Model Operations
307 1
|
8月前
|
定位技术
探秘站点检测访问中代理 IP 的实用技巧
随着互联网发展,使用代理IP的需求增加。站点检测代理IP的方法包括:1. IP地址黑名单;2. HTTP头部检查(如X-Forwarded-For);3. 行为分析;4. 地理位置检测;5. CAPTCHA验证;6. 连接特征分析。这些技术帮助网站判断访问是否来自代理。
197 6
|
9月前
|
Python
通义灵码写童年小游戏挑战赛
通义灵码版本升级啦,支持多种上下文组合,包括 #image 、#file、#codeChanges、#gitCommit 等,立即体验。
|
11月前
|
JavaScript 前端开发 安全
跨域解决方案有哪些?
本文介绍了多种跨域解决方案,包括JSONP、CORS、postMessage、WebSocket、document.domain+iframe、window.name、location.hash、Node.js代理、Nginx代理和CORS Anywhere。每种方法都有其适用场景和优缺点,如JSONP简单但只支持GET请求,CORS安全但兼容性稍差,WebSocket适用于实时通信但需服务器支持。开发者可根据具体需求选择合适的跨域方案。
280 3
跨域解决方案有哪些?
|
10月前
|
JSON API 开发者
淘系买家秀API接口系列,示例代码返回值说明
淘宝买家秀API接口是阿里巴巴旗下的淘宝平台提供的一种接口服务,允许淘宝商家或开发者通过编程方式获取并展示淘宝商品的买家秀信息,包括买家上传的图片、视频、评论等内容。以下是对淘宝买家秀API接口的详细介绍:
|
11月前
|
SQL 存储 分布式计算
Hadoop-16-Hive HiveServer2 HS2 允许客户端远程执行HiveHQL HCatalog 集群规划 实机配置运行
Hadoop-16-Hive HiveServer2 HS2 允许客户端远程执行HiveHQL HCatalog 集群规划 实机配置运行
174 3
|
运维 前端开发 算法
阿里及各大企业中台架构详解(上)
阿里及各大企业中台架构详解
1603 0
阿里及各大企业中台架构详解(上)
|
人工智能 搜索推荐 数据安全/隐私保护
别错过!2024年苹果iPhone AI革命:揭秘技术突破与未来蓝图
本文首发于公众号“AntDream”。2024年,苹果iPhone在技术创新方面展现了一系列亮点,包括Apple Intelligence集成、Siri的进化、系统范围的写作工具、图像生成能力、跨应用任务处理、隐私保护加强等。iOS 18带来了多项改进,如屏幕图标重新设计、新增卫星短信等功能。后续规划包括Apple Intelligence的推广、与其他AI模型合作、硬件发展、软件生态扩展、全球多语言支持等。苹果将继续优化用户体验和强化隐私保护,探索AI技术在健康监测、增强现实等领域的应用,持续引领智能手机领域的创新潮流。
669 1
|
网络协议 数据库 网络架构
OSPF 路由器 ID 的用途
【8月更文挑战第24天】
309 0
|
设计模式 存储 前端开发
18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
240 4