图像灰度化的三种方法及matlab,c++,python实现

灰度化处理就是将一幅色彩图像转化为灰度图像的过程。彩色图像分为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)





             

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

你可能感兴趣的:(matlab,python,数字图像处理,c++,opencv)