图像处理---灰度处理(黑白效果)

转自:图像处理:黑白效果(灰度处理)

1.效果图:
        

2.实现原理:
        图像灰度化就是使色彩的三种颜色分量R、G、B的值相同,由于颜色值的取值范围是[0,255],所以灰度的
        级别只有256种,即灰度图象仅能表现256种灰度颜色,常用有3种处理方法:
        *最大值法(Maximum):R=G=B=Max(R,G,B),这种方法处理后灰度图象的亮度会偏高。
        *平均值法(Average):R=G=B=(R+G+B)/3,这种方法处理后灰度图象的亮度较柔和。
        *加权平均值法(Weighted Average):
                R=G=B=wr*R+wg*G+wb*B,wr、wg、wb分别为R、G、B的权值。
                当其权值取不同的值时,能够形成不同灰度的灰度图象,由于人眼对绿色的敏感度最高,红色次之,
                蓝色最低,因此当w> w> wb时,所产生的灰度图像更符合人眼的视觉感受。
                通常wr=30%,wg=59%,wb=11%,图像的灰度最合理。
                以下的程序使用的是wr=70%,wg=20%,wb=10%觉得效果更好。

3.实现代码:


1public enum AlgorithmsType
2    {
3       MaxValue,           //最大值法
4        AverageValue,       //平均值法
5        WeightAverage       //加权平均值法
6    }


public static Image Gray(Image img, AlgorithmsType algo)
        {
            int width = img.Width;
            int height = img.Height;

Bitmap bmp = new Bitmap(img);

//设定实例BitmapData相关信息
            Rectangle rect = new Rectangle(0, 0, width, height);            
            ImageLockMode mode = ImageLockMode.ReadWrite;
            PixelFormat format = PixelFormat.Format32bppArgb;

//锁定bmp到系统内存中
            BitmapData data = bmp.LockBits(rect, mode, format);

//获取位图中第一个像素数据的地址
            IntPtr ptr = data.Scan0;

int numBytes = width * height * 4;
            byte[] rgbValues = new byte[numBytes];

//将bmp数据Copy到申明的数组中
            Marshal.Copy(ptr, rgbValues, 0, numBytes);

for (int i = 0; i < rgbValues.Length; i += 4)
            {
                int value = 0;
                switch (algo)
                {
                    //最大值法
                    case AlgorithmsType.MaxValue:
                        value = rgbValues[i] > rgbValues[i + 1] ? rgbValues[i] : rgbValues[i + 1];
                        value = value > rgbValues[i + 2] ? value : rgbValues[i + 2];
                        break;
                    //平均值法
                    case AlgorithmsType.AverageValue:
                        value = (int)((rgbValues[i] + rgbValues[i + 1] + rgbValues[i + 2]) / 3);
                        break;
                    //加权平均值法
                    case AlgorithmsType.WeightAverage:
                        value = (int)(rgbValues[i] * 0.1 + rgbValues[i + 1] * 0.2 
                            + rgbValues[i + 2] * 0.7);
                        break;
                }

//将数组中存放R、G、B的值修改为计算后的值
                for (int j = 0; j < 3; j++)
                {
                    rgbValues[i + j] = (byte)value;
                }
            }

//将数据Copy到内存指针
            Marshal.Copy(rgbValues, 0, ptr, numBytes);

//从系统内存解锁bmp
            bmp.UnlockBits(data);

return (Image)bmp;

}

4.说明:
        使用GetPixel方法和SetPixel方法的实现参考柔化(平滑)处理        使用不安全模式参考椒盐噪声(杂点)方法一;
        本例实现方法与椒盐噪声(杂点)方法二相同。

图像处理---灰度处理(黑白效果)

时间: 2024-12-15 20:29:07

图像处理---灰度处理(黑白效果)的相关文章

Atitit 图像处理之仿油画效果&#160;Oilpaint油画滤镜 水彩画 漫画滤镜&#160;v2

Atitit 图像处理之仿油画效果 Oilpaint油画滤镜 水彩画 漫画滤镜 v2 1.1. 具体源码参考1 2. ,油画 水彩画具有几个比较明显的特点如下:1 2.1. 明暗层次(灰度)较少  也就5级别够用了1 2.2. 颜色泛用   使用的颜色比较单一,一般不会超过7种颜色,不像真实照片那样,具有丰富的颜色种类:2 3. 水彩画滤镜算法如下:2 3.1. 这个其实就是灰度层次降低维度的过程.3 3.2. 模板半径Radius用来调节水彩画的水彩程度.即是颜色的降低维度的过程3 3.3.

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

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

黑白效果函数

// 黑白效果函数 public static Bitmap changeToGray(Bitmap bitmap,boolean r, boolean g, boolean b) { int width, height; width = bitmap.getWidth(); height = bitmap.getHeight(); Bitmap grayBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); Can

图像处理之图像梯度效果(转载)

转载自:http://blog.csdn.net/jia20003/article/details/7664777 图像处理之图像梯度效果 基本思想: 利用X方向与Y方向分别实现一阶微分,求取振幅,实现图像梯度效果.关于如何计算图像 一阶微分参见这里:http://blog.csdn.net/jia20003/article/details/7562092 使用的两种微分算子分别为Prewitt与Sobel,其中Soble在X, Y两个方向算子分别为: Prewitt在X, Y方向上梯度算子分别

Unity3d 屏幕特效实现类似死亡之后的全屏黑白效果

全屏特效 黑白(对于<着色器和屏幕特效开发秘籍>的学习) 可实现死亡效果或需要黑白特效的效果 原理是通过OnRenderImage()函数在摄像机渲染的时候,改变颜色(饱和度) 新建一个c#脚本,将要放在摄像机中 [ExecuteInEditMode] 就是让这个脚本不开始也直接运行,方便观察效果 using UnityEngine; using System.Collections; [ExecuteInEditMode] public class ShaderTest : MonoBeha

android图像处理,实现变暗效果

图像处理主要是图像的颜色矩阵和坐标矩阵进行处理,要实现变暗效果只需要对颜色矩阵中的RGB偏移减小即可,具体代码如下: int brightness = -80; //RGB偏移量,变暗为负数 ColorMatrix matrix = new ColorMatrix(); matrix.set(new float[]{1, 0, 0, 0, brightness, 0, 1, 0, 0, brightness, 0, 0, 1, 0, brightness, 0, 0, 0, 1, 0}); Co

Atitit 图像处理 灰度图片 灰度化的原理与实现

24位彩色图与8位灰度图 首先要先介绍一下24位彩色图像,在一个24位彩色图像中,每个像素由三个字节表示,通常表示为RGB.通常,许多24位彩色图像存储为32位图像,每个像素多余的字节存储为一个alpha值,表现有特殊影响的信息[1]. 在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值.亮度值),灰度范围为0-255[2].这样就得到一幅图片的灰度图. 几种灰度化的方法 分量法:使用RGB三个分量中的一

图像处理——灰度化、二值化、膨胀算法、腐蚀算法以及开运算和闭运算

一.RGB RGB色彩模式使用RGB模型为图像中每个像素的RGB分量分配一个0~255范围内的强度值.RGB图像仅仅使用三种颜色,R(red).G(green).B(blue),就能够使它们依照不同的比例混合,在屏幕上呈现16777216(256 * 256 * 256)种颜色. 在电脑中,RGB的所谓"多少"就是指亮度,并使用整数来表示.通常情况下,RGB各有256级亮度,用数字表示为从0.1.2...直到255. 二.ARGB 一种色彩模式,也就是RGB色彩模式附加上Alpha(透

图像处理之六边形网格分割效果

一:原理 根据输入参数blockSize的大小,将图像分块,决定每块的中心通过该像素块内所有 像素之和的均值与该块内部每个像素比较,RGB值之间几何距离最小为新的中心,迭 代更新运算,直到达到输入参数声明的最大循环次数为止,然后输出结果图像即可. 二:程序实现 类MyCluster,存储每个像素块中心的信息,计算中心位置. 类SuperPixelsFilter, 滤镜实现,完成六边形网格分割的主要功能,其中距离计算,基 于欧几里德距离公式. 三:效果 原图: 效果: 四:完全源代码 packag