图像滤镜处理算法:灰度、黑白、底片、浮雕

图片数据清洗 前言 数据对于深度学习算法模型的效果至关重要。通常,在对采集到的大量数据进行标注前需要做一些数据清洗工作。对于大量的数据,人工进行直接清洗速度会很慢,因此开发一些自动化清洗工具对批量数据首先进行自动清洗,然后再进行人工审核并清洗,可以很大程度上提高效率。 工具功能 根据收集到的需求,工具主要实现了以下功能: 统计数据信息(总占用空间、数量、损坏图片数); 去除已损坏图片, 去除模糊图片, 去除相似图片, 机动车车色分类, 昼夜分类 统计数据信息 # 获取数据集存储大小、图片数量、破损图片数量 def g 阅读详情

尊重原创,原文出处:http://www.icodelogic.com/?p=575

最近手机端图片类的应用很火,比如刚被Facebook收购的Instagram,还有以前ipad上很有意思的一款应用Photo Booth。图片类应用,免不了对图片的处理,常见的滤镜效果,如灰度、底片、浮雕、柔化、光照等效果,更有意思的有各种如哈哈镜一般的变型特效,当然,也有其他的人物面部美化、图片合成等高级功能,这些功能组合在一起便能够提供十分新奇的体验。

下面介绍几种简单的图片处理算法,通过这几种算法,也能大致明白滤镜处理的算法原理。

1 灰度图片

前文阐述过关于图片的一些基本知识,彩色照片有RGB_8888、RGB_4444、RGB_565这么几种,每一个像素的颜色值由红、绿、蓝三种值混合而成,红绿蓝的取值分别由很多种,于是像素的颜色值也可以有很多种颜色值,这就是彩色图片的原理,而灰度照片则只有256种颜色,一般的处理方法是将图片颜色值的RGB三个通道值设为一样,这样原本的256*256*256种颜色就只有256种了,256种颜色值就丢失了图片的彩色信息,留下的只有亮度值,视觉上看上去就是灰色的图片。

灰度处理一般有三种算法:
1 最大值法:即新的颜色值R=G=B=Max(R,G,B),这种方法处理后的图片看起来亮度值偏高。
2 平均值法:即新的颜色值R=G=B=(R+G+B)/3,这样处理的图片十分柔和
3 加权平均值法:即新的颜色值R=G=B=(R * Wr+G*Wg+B*Wb),一般由于人眼对不同颜色的敏感度不一样,所以三种颜色值的权重不一样,一般来说绿色最高,红色其次,蓝色最低,最合理的取值分别为Wr = 30%,Wg = 59%,Wb = 11%

这是原图:

下面是处理后的图片:

有了算法,实现起来就很简单了,下面是采用加权平均值算法的代码,代码运行于Android环境,不过是采用jni编写的,是C代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
jintArray Java_com_spore_meitu_jni_ImageUtilEngine_toGray(JNIEnv* env,
		jobject thiz, jintArray buf, jint width, jint height)
{
	// buf中是原图片的颜色数组,函数返回结果也是颜色数组,
	// 需要把颜色数组转换成Bitmap
	jint * cbuf;
	cbuf = (*env)->GetIntArrayElements(env, buf, 0);
 
	int newSize = width * height;
	jint rbuf[newSize]; // 新图像像素值
 
	int count = 0;
	int preColor = 0;
	int prepreColor = 0;
	int color = 0;
	preColor = cbuf[0];
 
	int i = 0;
	int j = 0;
	for (i = 0; i < width; i++)
	{
		for (j = 0; j < height; j++)
		{
			int curr_color = cbuf[j * width + i];
			int r = red(curr_color);
			int g = green(curr_color);
			int b = blue(curr_color);
			int modif_color = (int)(r * 0.3 + g * 0.59 + b * 0.11);
			rbuf[j * width + i] = ARGB(alpha(curr_color),modif_color,modif_color,modif_color);
		}
	}
	jintArray result = (*env)->NewIntArray(env, newSize); // 新建一个jintArray
	(*env)->SetIntArrayRegion(env, result, 0, newSize, rbuf); // 将rbuf转存入result
	(*env)->ReleaseIntArrayElements(env, buf, cbuf, 0); // 释放int数组元素
	return result;
}

2 黑白图片
这里的黑白图片,跟上面的灰度不一样。灰度有256种颜色,而黑白则是只保留黑和白这两种颜色,看了后面的对比处理图片就能明白了。

黑白图片的处理算法更简单:
求RGB平均值Avg = (R + G + B) / 3,如果Avg >= 100,则新的颜色值为R=G=B=255;如果Avg < 100,则新的颜色值为R=G=B=0;255就是白色,0就是黑色;至于为什么用100作比较,这是一个经验值吧,设置为128也可以,可以根据效果来调整。

处理后的图片:

黑白效果处理的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        int i = 0;
	int j = 0;
	int iPixel = 0;
	for (i = 0; i < width; i++)
        {
		for (j = 0; j < height; j++)
                {
			int curr_color = cbuf[j * width + i];
 
			int avg = (red(curr_color) + green(curr_color) + blue(curr_color)) / 3;
			if (avg >= 100) 
                        {
				iPixel = 255;
			} 
                        else 
                        {
				iPixel = 0;
			}
			int modif_color = ARGB(255, iPixel, iPixel, iPixel);
			rbuf[j * width + i] = modif_color;
		}
	}

3 底片效果
算法原理:将当前像素点的RGB值分别与255之差后的值作为当前点的RGB值,即
R = 255 – R;G = 255 – G;B = 255 – B;

处理后的图片:

底片效果实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        int i = 0;
	int j = 0;
	int iPixel = 0;
	for (i = 0; i < width; i++) 
        {
		for (j = 0; j < height; j++) 
                {
			int curr_color = cbuf[j * width + i];
 
			int r = 255 - red(curr_color);
			int g = 255 - green(curr_color);
			int b = 255 - blue(curr_color);
			int a = alpha(curr_color);
			int modif_color = ARGB(a, r, g, b);
			rbuf[j * width + i] = modif_color;
		}
	}

4 浮雕效果
浮雕的算法相对复杂一些,用当前点的RGB值减去相邻点的RGB值并加上128作为新的RGB值。由于图片中相邻点的颜色值是比较接近的,因此这样的算法处理之后,只有颜色的边沿区域,也就是相邻颜色差异较大的部分的结果才会比较明显,而其他平滑区域则值都接近128左右,也就是灰色,这样
就具有了浮雕效果。

在实际的效果中,这样处理后,有些区域可能还是会有”彩色”的一些点或者条状痕迹,所以最好再对新的RGB值做一个灰度处理。

处理后的效果如下:

浮雕效果实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        int preColor = 0;
        int prepreColor = 0;
        preColor = cbuf[0];
 
	int i = 0;
	int j = 0;
	for (i = 0; i < width; i++)
	{
		for (j = 0; j < height; j++)
		{
			int curr_color = cbuf[j * width + i];
			int r = red(curr_color) - red(prepreColor) + 128;
			int g = green(curr_color) - red(prepreColor) + 128;
			int b = green(curr_color) - blue(prepreColor) + 128;
			int a = alpha(curr_color);
 
			int newcolor = (int)(r * 0.3 + g * 0.59 + b * 0.11);
 
			int modif_color = ARGB(a, newcolor, newcolor, newcolor);
			rbuf[j * width + i] = modif_color;
			prepreColor = preColor;
			preColor = curr_color;
		}
	}

本文只介绍一下图像处理的算法原理,至于详细的代码,这里暂不提供。后续会有更多的滤镜算法介绍,届时会将完整的工程打包提供下载。

算法竞赛-黑白图像 输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者公共顶点,就说他们属于同一个八连块。 样例输入 : 6 100100 001010 000000 110000 111000 010100 样例输出: 3 遍历每一块黑色格子,以这块黑色格子为中心向四周搜索,如果被访问过则停止搜索 阅读详情

相关推荐

【SAP】ABAP——ALV显示后选择数据操作

在ALV显示后,可全选、全不选或者选择几条数据进行发邮件、更新、下单等等操作。 在user_command中的实现方式如下: 方式一: FORM user_command USING ucomm LIKE sy-ucomm selfield TYPE slis_selfield. DATA: lr_grid TYPE REF TO cl_gui_alv_grid. DATA: lt_rows TYPE lvc_t_row WITH

Mona_1220的博客 4069

PhotoShop 图像处理 算法 汇总

不定期更新 ...... 直接点标题即可链接到原文。OpenCV 版:OpenCV 图像处理图层混合算法:PS图层混合算法之一(不透明度,正片叠底,颜色加深,颜色减淡)PS图层混合算法之二(线性加深,线性减淡,变亮,变暗)PS图层混合算法之三(滤色, 叠加, 柔光, 强光)PS图层混合算法之四(亮光, 点光, 线性光, 实色混合)PS图层混合算法之五(饱和度,色相,颜色,亮度)PS图层混合算法...

weixin_30367873的博客 2300

计算机视觉教程2-6:八大图像特效算法制作你的专属滤镜(附Python代码)

美图软件中的那些滤镜效果是如何实现的?本文从原理到Python实战详解八大图像特效算法,为你的图片加一层属于自己的滤镜吧!

FRIGIDWINTER的博客 1万+

图像视频滤镜算法---颜色滤镜

  承接上一篇滤镜初识,本文将介绍第一种滤镜:颜色滤镜。 颜色滤镜 颜色滤镜即调色滤镜,也是最常见的滤镜,任何通过调节图像像素值的亮度、对比度、饱和度、色相等等方法,得到的不同于原图像颜色的效果,都统称为颜色滤镜。 我们来做一个颜色增强滤镜,以此说明,方便大家更好的理解。 如下图所示,我们对一副图在PS中进行饱和度调整(饱和度提高41): 那么,我们在这个过程中,算法实际上做了...

Trent1985的专栏 1万+

图像滤镜处理算法灰度黑白底片浮雕 (转)

最近手机端图片类的应用很火,比如刚被Facebook收购的Instagram,还有以前ipad上很有意思的一款应用Photo Booth。图片类应用,免不了对图片处理,常见的滤镜效果,如灰度底片浮雕、柔化、光照等效果,更有意思的有各种如哈哈镜一般的变型特效,当然,也有其他的人物面部美化、图片合成等高级功能,这些功能组合在一起便能够提供十分新奇的体验。 下面介绍几种简单的图片处理算法,通

qq_15079039的博客 781

Java 图像处理进阶:手写9种滤镜算法(含油画/浮雕/马赛克)与双缓冲绘图优化

在上一版博客中,我们实现了基础的绘图功能。今天,我们将代码进行了重构与升级,带来了一个功能更强大的Java 图像处理工具箱。本文不仅实现了马赛克、灰度、二值化等基础效果,还深度解析了油画、浮雕等复杂算法的实现原理。我们将重点讲解如何利用卷积矩阵(Kernel)处理图像,以及如何通过双缓冲技术解决界面闪烁问题。

2501_94593783的博客 607

扫描图像智能定位增强美化处理黑白处理

给大家分享下扫描类图像处理的结果: (1)包含功能模块:文档智能定位、裁剪矫正、图像增强并锐化、黑白灰度处理; (2)用在ios下可编译成.a库;用在Android下编译.aar或so库; (3)pc下含有测试exe的demo;协助在市场已有应用。 欢迎您加我q好友一起交流技术:690899868 效果图: ...

MyLove_VC的专栏 1673

图像视频滤镜算法详解系列

序言 为什么要写滤镜相关的内容?     这个问题其实不用回答,大家活在互联网高度发达的社会,发照片,发视频就像吃饭穿衣睡觉一样,已经成为了我们生活中的一部分,在发照片,发视频前,有谁没有用过一些特效处理呢?好像寥寥无几了。     也正因为如此,各种PC图像处理软件,各种手机图像视频处理APP,如日中天,而滤镜也成为了他们的必备功能,这里,本人将结合自己多年滤镜美颜美妆算法经验,给大家详细...

Trent1985的专栏 3038

ps图片黑白调整算法——java实现及性能优化

参考:http://blog.csdn.net/matrix_space/article/details/22992833 http://blog.csdn.net/majinlei121/article/details/46372887引文Photoshop 的图像黑白调整功能,是通过对红、黄、绿、青、蓝和洋红等6种颜色的比例调节来完成的。这个是一直都知道,还经常使用的。但是不清楚它是怎么计算的

Blog for 明月依希 2754

python 图像判断,清晰度(明暗),彩色与黑白

1,判断图像清晰度,明暗, 原理,Laplacian算法。偏暗的图片,二阶导数小,区域变化小;偏亮的图片,二阶导数大,区域变化快。 import cv2 def getImageVar(imgPath): image = cv2.imread(imgPath) img2gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) im...

luolinll1212的专栏 8755

图片数据清洗中超级常用的一招操作!

点击上方“AI算法图像处理”,选择加"星标"或“置顶”重磅干货,第一时间送达导读在做图像分类的任务中,经常需要将图片resize到指定的尺寸,例如 224,直接res...

zero的博客 2418

Java美颜相机入门(图像处理实现各种滤镜算法

一款简易美颜相机的功能我们可以简单分为两大块:1.图像处理 2.功能区。

weixin_53622554的博客 1558

基于通义千问2.5-7B-Instruct的技术深度解析

通义千问2.5-7B-Instruct是一个基于Transformer架构的大型语言模型,具有70亿参数。它通过自注意力机制和前馈神经网络处理输入序列,能够捕捉长距离依赖关系,适用于多种NLP任务。微调是指在预训练模型的基础上,使用特定任务的数据进行进一步训练,以使模型更好地适应特定任务。微调可以显著提高模型在特定任务上的性能。通义千问2.5-7B-Instruct是一个强大的语言模型,适用于多种NLP任务。通过深入理解其架构、微调方法和核心代码,可以更好地应用于实际场景。

zhangjiaofa的专栏 1543

西南交通大学模电实验.zip

西南交通大学模电实验,包括课件和本人的所有实验报告成果,欢迎参考

上一篇: 图像处理算法
下一篇: 位运算 加减乘除 负值判断
hnulwt
博客等级 码龄14年 140粉丝 44原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值