图像处理的三个基本操作——灰度化、锐化、平滑
来源:互联网 发布:陕西用友软件 编辑:程序博客网 时间:2024/06/06 05:16
什么是图像处理?
我的理解是,图像处理即就是对图像的各个像素点进行处理。
一、灰度化
灰度化,也就是黑白化,就是将图像进行黑白处理,使其失去色彩。而从像素点出发,就是使各个像素点的三种颜色分量R、G、B的值相同。
常用的黑白化的方法有三种:
- 第一种是最大值法(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的权值。
鉴于本人只使用了第二种,所以就先贴上第二种的代码:
public Bitmap bmp1; public Bitmap bmp2; //黑白化 //平均值法: 使用每个像素点的 R,G,B值等于原像素点的RGB值的平均值 //效率略低,暂未查明具体原因,需3秒等待 public Image BlackANDWhite(PictureBox pic) { bmp1 = new Bitmap(pic.Image); int width = bmp1.Width; int height = bmp1.Height; bmp2 = new Bitmap(width, height); Color c; for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { c = bmp1.GetPixel(x, y);//获取像素 int value = (c.R + c.G + c.B) / 3; bmp2.SetPixel(x, y, Color.FromArgb(value, value, value));//设置像素 } } return bmp2; }
以下是代码的相关结果展示:
(未处理的图片来自百度)
二、锐化
锐化就是通过增强高频分量来减少图象中的模糊,因此又称为高通滤波。锐化处理在增强图象边缘的同时增加了图象的噪声。
常用的锐化模板是拉普拉斯(Laplacian)模板,而本人也是采用的拉普拉斯模板进行的锐化处理。
下面是拉普拉斯模板的锐化处理的相关代码:
//锐化 //突出显示颜色值大(即形成形体边缘)的像素点 public Image Sharpen(PictureBox pic) { bmp1 = new Bitmap(pic.Image); int width = bmp1.Width; int height = bmp1.Height; bmp2 = new Bitmap(width, height); Color c; int[] Laplacian = { -1, -1, -1, -1, 9, -1, -1, -1, -1 };//拉普拉斯锐化模板 for (int x = 1; x < width - 1; x++) { for (int y = 1; y < height - 1; y++) { int r = 0, g = 0, b = 0; int Index = 0;
//两个for循环刚好将拉普拉斯锐化模板数组完全遍历
for (int col = -1; col <= 1; col++) for (int row = -1; row <= 1; row++) {
//获取bmp1的各个点的像素值
c = bmp1.GetPixel(x + row, y + col); r += c.R * Laplacian[Index]; g += c.G * Laplacian[Index]; b += c.B * Laplacian[Index]; Index++; }
//要注意的是,运算后如果出现了大于255或者小于0的点,称为溢出, //溢出点的处理通常是截断,即大于255时,令其等于255;小于0时,取其绝对值。
//处理颜色值溢出 r = r > 255 ? 255 : r; r = r < 0 ? 0 : r; g = g > 255 ? 255 : g; g = g < 0 ? 0 : g; b = b > 255 ? 255 : b; b = b < 0 ? 0 : b;
//将bmp2的各个像素点进行赋值
bmp2.SetPixel(x - 1, y - 1, Color.FromArgb(r, g, b)); } } return bmp2; }
下面是锐化结果的展示:
<img style="width: 283px; height: 448px;" src="http://img.blog.csdn.net/20151105143315175?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="306" height="745" alt="" /> <img style="width: 292px; height: 447px;" src="http://img.blog.csdn.net/20151105143322105?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="303" height="770" alt="" />
(未处理的图片来自百度)
三、平滑
平滑与锐化相反,就是滤掉高频分量,从而达到减少图象噪声,使图片变得有些模糊。
常用的平滑处理方法有三种:
- Box模板去噪平滑处理,也就是均一化处理。
Box模板是{1,1,1,1,1,1,1,1,1}
- 高斯模板去噪平滑处理,就是在Box模板的基础上加入了加权系数,考虑了距离某点位置越近影响越大的因素。相比Box模板,较为清晰一些。
高斯模板是{1,2,1,2,4,2,1,2,1}
- 中值滤波去噪平滑处理,就是将该点左右邻近的两个点的rgb值与该点自身进行比较,选择其中最中间的值赋给该点。
下面是平滑处理的相关代码:
//Box模板去噪平滑处理 public void Box_Smooth(PictureBox pic) { bmp1 = new Bitmap(pic.Image); int width = bmp1.Width; int height = bmp1.Height; bmp2 = new Bitmap(width, height); Color c; int[] Box = { 1, 1, 1, 1, 1, 1, 1, 1, 1 };//Box模板 for (int x = 1; x < width - 1; x++) { for (int y = 1; y < height - 1; y++) { int r = 0, g = 0, b = 0; int Index = 0; for (int col = -1; col <= 1; col++) for (int row = -1; row <= 1; row++) { c = bmp1.GetPixel(x + row, y + col); r += c.R * Box[Index]; g += c.G * Box[Index]; b += c.B * Box[Index]; Index++; } r = r / 9; g = g / 9; b = b / 9; //处理颜色值溢出 r = r > 255 ? 255 : r; r = r < 0 ? 0 : r; g = g > 255 ? 255 : g; g = g < 0 ? 0 : g; b = b > 255 ? 255 : b; b = b < 0 ? 0 : b; bmp2.SetPixel(x, y, Color.FromArgb(r, g, b)); } } } //高斯模板去噪平滑处理 public void Gauss_Smooth(PictureBox pic) { bmp1 = new Bitmap(pic.Image); int width = bmp1.Width; int height = bmp1.Height; bmp2 = new Bitmap(width, height); Color c; int[] Guass = { 1, 2, 1, 2, 4, 2, 1, 2, 1 };//Gauss模板 for (int x = 1; x < width - 1; x++) { for (int y = 1; y < height - 1; y++) { int r = 0, g = 0, b = 0; int Index = 0; for (int col = -1; col <= 1; col++) for (int row = -1; row <= 1; row++) { c = bmp1.GetPixel(x + row, y + col); r += c.R * Guass[Index]; g += c.G * Guass[Index]; b += c.B * Guass[Index]; Index++; } r = r / 16; g = g / 16; b = b / 16; //处理颜色值溢出 r = r > 255 ? 255 : r; r = r < 0 ? 0 : r; g = g > 255 ? 255 : g; g = g < 0 ? 0 : g; b = b > 255 ? 255 : b; b = b < 0 ? 0 : b; bmp2.SetPixel(x, y, Color.FromArgb(r, g, b)); } } } //中值滤波去噪平滑处理 public void MiddleValue_Smooth(PictureBox pic) { bmp1 = new Bitmap(pic.Image); int width = bmp1.Width; int height = bmp1.Height; bmp2 = new Bitmap(width, height); //分别建立r,g,b数组 int[] r = new int[3]; int[] g = new int[3]; int[] b = new int[3]; for (int x = 1; x < width - 1; x++) { for (int y = 1; y < height - 1; y++) { int Index = 0; for (int row = -1; row <= 1; row++) { Color c = bmp1.GetPixel(x + row, y);//获取像素值 //分别给r,g,b数组赋值 r[Index]= c.R ; g[Index]= c.G ; b[Index]= c.B ; Index++; } //排序 Array.Sort(r); Array.Sort(g); Array.Sort(b); //处理颜色值溢出 r[1] = r[1] > 255 ? 255 : r[1]; r[1] = r[1] < 0 ? 0 : r[1]; g[1] = g[1] > 255 ? 255 : g[1]; g[1] = g[1] < 0 ? 0 : g[1]; b[1] = b[1] > 255 ? 255 : b[1]; b[1] = b[1] < 0 ? 0 : b[1]; bmp2.SetPixel(x - 1, y - 1, Color.FromArgb(r[1], g[1], b[1])); } } }
下面是是那种平滑处理所得的效果图与原图的对比展示:
原图:
Box模板: Guass模板: 中值滤波:
- 图像处理的三个基本操作——灰度化、锐化、平滑
- 数字图像处理-图像的平滑和锐化。
- 实验四 灰度图像的锐化处理
- 图像处理-平滑和锐化
- Opencv学习笔记(四)--图像处理平滑,锐化操作
- 图像处理之图像的平滑与锐化
- 实验三 灰度图像的平滑处理
- 图像处理——锐化
- OpenCV 图像处理——平滑操作
- 由图像的灰度化看基本图像处理(1)
- 由图像的灰度化看基本图像处理(2)
- 由图像的灰度化看基本图像处理(3)
- 图像处理的方法列举(普通处理、灰度变换、图像锐化)
- matlab 图像的平滑和锐化
- 【数字图像】C++8位和24位BMP位图的平滑、锐化、二值化处理,以及24位真彩图的灰度化
- C++8位和24位bmp位图平滑、锐化和二值处理,24位真彩图的灰度化
- 数字图像处理编成入门笔记——第三章图象的平滑(去噪声)、锐化
- 图像处理—灰度处理
- 浅析关于ObjectC中的自定义初始化方法和便利构造器以及重写父类的description方法的理解
- 使用Windows创建Nginx+Apache的负载均衡
- swift:制作一个简单的tableheaderview+_navigationbar渐变效果(二)
- Maya_角色动画制作流程
- c++ 测试框架简介
- 图像处理的三个基本操作——灰度化、锐化、平滑
- 修改Oracle用户密码
- nginx+php-fpm总是504 time out
- Spark1.51 本地启动了Master和一个Slave后,在Spark-Shell里跑,看出sc.textFile找数据的stacktrace
- duplicate symbols for architecture i386
- ubuntu15.10配置LNMP(linux+nginx+mysql+php)
- 英语学习素材
- 传统软件行业和互联网行业有什么区别?
- 2015-11-05