简单的图像滤镜运算法则

简单的图像滤镜运算法则


位图文件主要存储的是一个一个的像素,它是一个长乘宽的二维数组,每一个数组元素都是一个RGB

struct,里面有3个Byte(字节),分别存储着RGB(即红绿蓝)三原色的值,从0到255,数字越大颜色越

亮,(0,0,0)代表黑色,(255,255,255)代表白色。

我们假设有一个非常小的位图图像(height=2,width=4),那么它在内存中最重要的部分(也就是像素

存储部分)可以表示为:
(0,0,0) (0,0,0)(0,0,0)
(0,0,0) (0,0,0)(0,0,0)
(0,0,0) (0,0,0)(0,0,0)
如果它存储在数组pixel[2][4]中,改变为灰色的位图很简单只需把它的值改为:
(127,127,127)(127,127,127)(127,127,127)
(127,127,127)(127,127,127)(127,127,127)
(127,127,127)(127,127,127)(127,127,127)

下面说说滤镜(filter)和卷积(convolution),举个例子说明:
有一个4*4的图像存储在G[i][j](i,j=0~3)中:
2 2 2 2
3 2 3 3
4 6 4 5
5 6 6 6
有一个3*3的滤镜F[i][j](i,j=0~2);
1 2 1
1 1 1
1 1 1
二者如何卷积(convolution)运算呢?假设产生的新图为N[i][j],N*F的卷积为:
N[i][j]=G[i-1][j-1]*F[i-1][j-1]+G[i][j-1]*F[i][j-1]+G[i+1][j-1]*F[i+1][j-1]+G[i-1][j]*F[i-

1][j]+G[i][j]*F[i][j]+G[i+1][j]*F[i+1][j]+G[i+1][j-1]*F[i+1][j-1]+G[i][j+1]*F[i][j+1]+G

[i+1][j+1]*F[i+1][j+1]

例如,要计算N[1][1]等于多少?说的具体点就是将这个滤镜套在旧图G上,将滤镜的中心F[1][1]与G[1]

[1]对齐,然后将重合的地方相乘,再将它们加起来,结果是:
N[1][1]为:
2 2 2 2
3 3.2 3 3
4 4.3 4.5 5
5 6 6 6
新图的N[1][1]点的值是原来旧图G[1][1]点的四周8个点,和本身加起来求和,又除以9的结果,实际上是

实现了邻域平均,图像编的模糊和柔化了。这里的F[i][j]就是邻域平均的一种滤镜。

你可能感兴趣的:(算法)