灰度化处理就是将一幅色彩图像转化为灰度图像的过程。彩色图像分为R,G,B三个分量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色的R,G,B分量相等的过程。灰度值大的像素点比较亮(像素值最大为255,为白色),反之比较暗(像素最下为0,为黑色)。

图像灰度化的算法主要有以下3种:

(1)最大值法:使转化后的R,G,B得值等于转化前3个值中最大的一个,即:

R=G=B=max(R,G,B)                    (1)

这种方法转换的灰度图亮度很高。

(2)平均值法:是转化后R,G,B的值为转化前R,G,B的平均值。即:

R=G=B=(R+G+B)/3                                (2)

这种方法产生的灰度图像比较柔和。

(3)加权平均值法:按照一定权值,对R,G,B的值加权平均,即:

       (3)

分别为R,G,B的权值,取不同的值形成不同的灰度图像。由于人眼对绿色最为敏感,红色次之,对蓝色的敏感性最低,因此使将得到较易识别的灰度图像。一般时,得到的灰度图像效果最好。


一、matlab代码实现:

%%三种方法实现灰度化与调用MATLAB函数实现灰度化
close all;
clear all;Img=imread('11.jpg');
[n m a]=size(Img);%判断图像的大小GrayImage= rgb2gray(Img);%调用MATLAB函数实现灰度化Img_Gray=zeros(n,m);
for x=1:n%通过双循环对图像进行灰度化处理for y=1:m%  Img_Gray(x,y)=max(Img(x,y,1),max(Img(x,y,2),Img(x,y,3)));  %第一种方法实现灰度化%   Img_Gray(x,y)=(Img(x,y,1)+Img(x,y,2)+Img(x,y,3))/3;%第二种方法实现灰度化Img_Gray(x,y)=0.3*Img(x,y,1)+0.59*Img(x,y,2)+0.11*Img(x,y,3);%第三种方法实现灰度化end
end
figure,imshow(Img);title('原图像')
figure,imshow(GrayImage);title('调用系统函数实现灰度化')
figure,imshow(uint8(Img_Gray));title('第三种方法')

效果图:

原图                             调用matlab函数                            第三种方法

二、vc+opencv实现:

#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
#include
#includeint _tmain(int argc, _TCHAR* argv[])
{IplImage    *Image;                        //定义相应的图像指针  IplImage    *Image_r;                        //从1~5代表5中不同权值的结果  IplImage    *Image_g;  IplImage    *Image_b;IplImage    *GrayImage;IplImage    *Gray_Image;Image = cvLoadImage( "11.jpg", -1 );    //读取图片  if (Image == NULL)  return -1;   Image_r = cvCreateImage(cvGetSize(Image),8,1);  Image_g = cvCreateImage(cvGetSize(Image),8,1);  Image_b = cvCreateImage(cvGetSize(Image),8,1);GrayImage = cvCreateImage(cvGetSize(Image),8,1);Gray_Image = cvCreateImage(cvGetSize(Image),8,1);CvMat* pMat_r = NULL;         //定义与图像关联的数据指针  CvMat* pMat_g = NULL;  CvMat* pMat_b = NULL;  CvMat* pGrayMat = NULL;pMat_r = cvCreateMat(Image->height, Image->width, CV_32FC1);  pMat_g  = cvCreateMat(Image->height, Image->width, CV_32FC1);  pMat_b  = cvCreateMat(Image->height, Image->width, CV_32FC1); pGrayMat= cvCreateMat(Image->height, Image->width, CV_32FC1);BYTE r;       //中间过程变量  BYTE g;  BYTE b;BYTE Gray;  for(int j=0; jheight; j++)  {  for(int i=0; iwidth; i++)  {             b = (BYTE)Image->imageData[j*Image->widthStep + i*3];     //B分量  g = (BYTE)Image->imageData[j*Image->widthStep + i*3 + 1]; //G分量  r = (BYTE)Image->imageData[j*Image->widthStep + i*3 + 2]; //R分量  //       Gray = max(g, max(b,r));    //第一种方法 //        Gray  = (BYTE)((r + g + b)/3); //第二种方法 Gray  = (BYTE)(0.11*b + 0.59*g + 0.30*r);//第三种方法  cvmSet(pGrayMat, j, i, Gray); }  } cvCvtColor(Image,Gray_Image,CV_BGR2GRAY); //调用opencv函数实现灰度化cvConvert(pGrayMat, GrayImage);  cvNamedWindow( "Image",CV_WINDOW_AUTOSIZE);  cvNamedWindow( "GrayImage",CV_WINDOW_AUTOSIZE);cvNamedWindow( "Gray_Image",CV_WINDOW_AUTOSIZE); cvShowImage("Image", Image);  cvShowImage("GrayImage", GrayImage);  cvShowImage("Gray_Image", GrayImage);cvWaitKey(0);  cvDestroyWindow("Image");   cvDestroyWindow("GrayImage"); cvDestroyWindow("Gray_Image");cvReleaseImage(&Image);  cvReleaseImage(&GrayImage); cvReleaseImage(&Gray_Image);cvReleaseMat(&pGrayMat);  return 0;
}

效果图:


                                         原图                       直接调用opencv函数                 第三种方法实现

三、python+opencv代码实现:

import cv2  img = cv2.imread("11.jpg")
GrayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow("Image", img)
cv2.imshow("grayImage", GrayImage)
cv2.waitKey (0)
cv2.destroyAllWindows()
#第一种方法
import cv2.cv as cv
image = cv.LoadImage('11.jpg')
grayimg= cv.CreateImage(cv.GetSize(image), image.depth, 1)
for i in range(image.height):for j in range(image.width):grayimg[i,j] = max(image[i,j][0], image[i,j][1], image[i,j][2])
cv.ShowImage('srcImage', image)
cv.ShowImage('grayImage', grayimg)
cv.WaitKey(0)
#第二种方法
import cv2.cv as cv
image = cv.LoadImage('11.jpg')
grayimg = cv.CreateImage(cv.GetSize(image), image.depth, 1)
for i in range(image.height):for j in range(image.width):grayimg[i,j] = (image[i,j][0] + image[i,j][1] + image[i,j][2])/3
cv.ShowImage('srcImage', image)
cv.ShowImage('grayImage', grayimg)
cv.WaitKey(0)
#第三种方法
import cv2.cv as cv
image = cv.LoadImage('11.jpg')
grayimg = cv.CreateImage(cv.GetSize(image), image.depth, 1)
for i in range(image.height):for j in range(image.width):grayimg[i,j] = 0.3 * image[i,j][0] + 0.59 * image[i,j][1] +  0.11 * image[i,j][2]
cv.ShowImage('srcImage', image)
cv.ShowImage('grayImage', grayimg)
cv.WaitKey(0)

效果图:

原图                                            直接调用函数                                第三种方法

图像灰度化的三种方法(matlab、C++、Python实现)相关推荐

  1. 图像灰度化的三种方式

    目录 一.为什么要图像灰度化 二.灰度化的主要方法 2.1取通道最大值 2.2平均值法 2.3加权法 三.示例 一.为什么要图像灰度化 目前很多的图像算法都是基于灰度图像的,比如特征点提取,特征点匹配 ...

  2. matlab实现彩色图像灰度化的三种方法

    一.概要 将彩色图像转换为灰度图像的过程称为灰度化处理. 对于图像而言,灰度化处理就是使彩色的R,G,B分量值相等的过程. 灰度化处理的方法主要有如下3种: 最大值法:使R,G,B的值等于3值中最大的 ...

  3. 图像灰度化的三种常见方法源码

    图像灰度化是图像处理很基础的一部分,在这里给出图像灰度化的三种常见方法的M源码,以供大家参考~ 平均值法,最大值法,加权平均值法 function f=MyGrayProcessing(Img) [m ...

  4. python实时监控文件目录_教你三种方法,用 Python实时监控文件

    原标题:教你三种方法,用 Python实时监控文件 在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题后去解决 ...

  5. OpenCV精进之路(零):访问图像中像素的三种方法

    访问像素的三种方法 指针访问:最快 迭代器iterator:较慢,非常安全,指针访问可能出现越界问题 动态地址计算:更慢,通过at()实现.适用于访问具体某个第i行,j列的像素,而不适用遍历像素 这里 ...

  6. 利用opencv实现图像马赛克处理的三种方法

    前言:本文就图像的马赛克处理,基于opencv提出了三种解决方案,并详细地介绍了三种方法的原理.示例.问题及问题的解决方案. 方法一 原理介绍:利用resize()将图片先缩小,再放大 代码示例: i ...

  7. python打印菱形三种方法_用python打印菱形的实操方法和代码

    python怎么打印菱形?下面给大家带来三种方法: 第一种 rows = int(input('请输入菱形边长:\n')) row = 1 while row <= rows: col = 1 ...

  8. python实现逻辑回归三种方法_纯Python实现逻辑回归

    前几天使用后sklearn实现了逻辑回归,这里用纯python实现逻辑回归. 首先,我们定义一个sigmoid函数 def sigmoid(inX): #sigmoid函数 return 1.0/(1 ...

  9. 图像处理(灰度化的三种方式)

    图像给灰度化的原理,通过将得到的彩色图像转化为单色图的过程为灰度化. 将得到的彩色图像进行转化,简单的说就是将彩色图像转化为黑白(亮度)图像,灰度得到范围为0-255. 灰度化的好处: 通过将彩色图像 ...

最新文章

  1. ICON: 从单张图片重建穿衣服人体模型
  2. ubantu 16.04 mysql_Ubuntu 16.04下安装MySQL
  3. 解读ASP.NET 5 MVC6系列(9):日志框架
  4. 学习笔记(35):Python网络编程并发编程-协程(yield,greenlet,gevent模块)
  5. Android的sqlite使用外部,Android 使用外部已经建立好的sqlite数据库
  6. ubuntu中关闭防火墙
  7. [CareerCup][Google Interview] 找出最小排序次数
  8. Pytorch:比较函数
  9. Pandas 基础(17) - to_datetime
  10. Python-Socket-Programming(1)
  11. 『nForce主板』巧妙去掉“安全删除硬盘”图标!
  12. JAVA初学者推荐《Java开发实战经典》李兴华著
  13. 使用词和图嵌入来衡量统一医学语言系统概念之间的语义相关性
  14. 一次完整的http请求过程
  15. 如何制作毕业地图分布图_最简单的数据地图制作,一共6步搞定!
  16. 如何利用turtle制作一个滑稽表情
  17. 红薯 选择 MySQL 用的服务器硬件配置
  18. OptaPlanner的新约束表达方式 Constraint Streams
  19. 网友微博晒父母爱情 老爸每天给妈妈写情书
  20. python元组_Python 元组和分片

热门文章

  1. 【iCore3应用】基于iCore3双核心板的编码器应用实例
  2. django chart mysql,docker Django+mysql+ECharts+AngularJS简单搭建数据可视化
  3. 威学一百_涨价通知丨威学一百VIP全年畅学卡价格即将上调!
  4. ajax将数据显示在class为content的标签中_python爬取微博评论(无重复数据)
  5. php多表条件排除然后输出,php – 从具有多个要求的两个表中选择值,但仅使用其中一个...
  6. java扩展数组_Java数组扩展
  7. 我的RTOS 之二 --Threadx在skyeye上仿真測试(基于2410)
  8. MYSQL 横向展示数据
  9. 【转】SQL SERVER 获取存储过程返回值
  10. 技术博客2013年2月份头条记录