图像灰度化的三种方法(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
#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实现)相关推荐
- 图像灰度化的三种方式
目录 一.为什么要图像灰度化 二.灰度化的主要方法 2.1取通道最大值 2.2平均值法 2.3加权法 三.示例 一.为什么要图像灰度化 目前很多的图像算法都是基于灰度图像的,比如特征点提取,特征点匹配 ...
- matlab实现彩色图像灰度化的三种方法
一.概要 将彩色图像转换为灰度图像的过程称为灰度化处理. 对于图像而言,灰度化处理就是使彩色的R,G,B分量值相等的过程. 灰度化处理的方法主要有如下3种: 最大值法:使R,G,B的值等于3值中最大的 ...
- 图像灰度化的三种常见方法源码
图像灰度化是图像处理很基础的一部分,在这里给出图像灰度化的三种常见方法的M源码,以供大家参考~ 平均值法,最大值法,加权平均值法 function f=MyGrayProcessing(Img) [m ...
- python实时监控文件目录_教你三种方法,用 Python实时监控文件
原标题:教你三种方法,用 Python实时监控文件 在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题后去解决 ...
- OpenCV精进之路(零):访问图像中像素的三种方法
访问像素的三种方法 指针访问:最快 迭代器iterator:较慢,非常安全,指针访问可能出现越界问题 动态地址计算:更慢,通过at()实现.适用于访问具体某个第i行,j列的像素,而不适用遍历像素 这里 ...
- 利用opencv实现图像马赛克处理的三种方法
前言:本文就图像的马赛克处理,基于opencv提出了三种解决方案,并详细地介绍了三种方法的原理.示例.问题及问题的解决方案. 方法一 原理介绍:利用resize()将图片先缩小,再放大 代码示例: i ...
- python打印菱形三种方法_用python打印菱形的实操方法和代码
python怎么打印菱形?下面给大家带来三种方法: 第一种 rows = int(input('请输入菱形边长:\n')) row = 1 while row <= rows: col = 1 ...
- python实现逻辑回归三种方法_纯Python实现逻辑回归
前几天使用后sklearn实现了逻辑回归,这里用纯python实现逻辑回归. 首先,我们定义一个sigmoid函数 def sigmoid(inX): #sigmoid函数 return 1.0/(1 ...
- 图像处理(灰度化的三种方式)
图像给灰度化的原理,通过将得到的彩色图像转化为单色图的过程为灰度化. 将得到的彩色图像进行转化,简单的说就是将彩色图像转化为黑白(亮度)图像,灰度得到范围为0-255. 灰度化的好处: 通过将彩色图像 ...
最新文章
- ICON: 从单张图片重建穿衣服人体模型
- ubantu 16.04 mysql_Ubuntu 16.04下安装MySQL
- 解读ASP.NET 5 MVC6系列(9):日志框架
- 学习笔记(35):Python网络编程并发编程-协程(yield,greenlet,gevent模块)
- Android的sqlite使用外部,Android 使用外部已经建立好的sqlite数据库
- ubuntu中关闭防火墙
- [CareerCup][Google Interview] 找出最小排序次数
- Pytorch:比较函数
- Pandas 基础(17) - to_datetime
- Python-Socket-Programming(1)
- 『nForce主板』巧妙去掉“安全删除硬盘”图标!
- JAVA初学者推荐《Java开发实战经典》李兴华著
- 使用词和图嵌入来衡量统一医学语言系统概念之间的语义相关性
- 一次完整的http请求过程
- 如何制作毕业地图分布图_最简单的数据地图制作,一共6步搞定!
- 如何利用turtle制作一个滑稽表情
- 红薯 选择 MySQL 用的服务器硬件配置
- OptaPlanner的新约束表达方式 Constraint Streams
- 网友微博晒父母爱情 老爸每天给妈妈写情书
- python元组_Python 元组和分片
热门文章
- 【iCore3应用】基于iCore3双核心板的编码器应用实例
- django chart mysql,docker Django+mysql+ECharts+AngularJS简单搭建数据可视化
- 威学一百_涨价通知丨威学一百VIP全年畅学卡价格即将上调!
- ajax将数据显示在class为content的标签中_python爬取微博评论(无重复数据)
- php多表条件排除然后输出,php – 从具有多个要求的两个表中选择值,但仅使用其中一个...
- java扩展数组_Java数组扩展
- 我的RTOS 之二 --Threadx在skyeye上仿真測试(基于2410)
- MYSQL 横向展示数据
- 【转】SQL SERVER 获取存储过程返回值
- 技术博客2013年2月份头条记录