加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

图像灰度化的三种方法及MATLAB,VC+opencv,python+opencv的三种方法实现

(2015-07-16 13:44:23)
标签:

灰度

图像

方法

函数

分类: 图像处理
最近做有关图像处理方面的东西,顺便整理一下好方便查询
灰度化处理就是将一幅色彩图像转化为灰度图像的过程。彩色图像分为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的值加权平均,即:
                      http://s10/mw690/0064L9F9zy6TSC3k1UR99&690                 (3)
http://s4/mw690/0064L9F9zy6TSD1Aa9t83&690时,得到的灰度图像效果最好。

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函数

 http://s4/small/0064L9F9zy6TSDVZaRJf3&690
        用第三种方法
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()

效果图:

      http://s1/small/0064L9F9zy6TSER9hDOf0&690          http://s3/small/0064L9F9zy6TSF13OXo02&690
               原图                                           调用函数实现




0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有