灰度化处理就是将一幅色彩图像转化为灰度图像的过程。彩色图像分为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
#include
int _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)
效果图:
原图 直接调用函数 第三种方法