赞
踩
灰度化处理就是将一幅色彩图像转化为灰度图像的过程。彩色图像分为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)
效果图:
原图 直接调用函数 第三种方法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。