Opencv之图像灰度化

Opencv之图像灰度化,第1张

首先来看一下图像种类(ps: 这里介绍用到的彩色图像,灰度图像,二值图像,其他图像暂不做介绍)。

每个图像的像素通常对应于二维空间中一个特定的'位置',并且有一个或者多个与那个点相关的 采样值 组成 数值 。根据这些采样数目及特性的不同数字图像可以划分为:

二值图像 :图像中每个像素的亮度值(Intensity)仅可以取自0或1的图像,因此也称为1-bit图像。

灰度图像 :也称为灰阶图像: 图像中每个像素可以由0(黑)到255(白)的亮度值(Intensity)表示。0-255之间表示不同的灰度级。

彩色图像 (Color image):彩色猜巧察图像主要分为两种类型,RGB及CMYK。其中RGB的彩色图像是由三种不同颜色成分组合而成,一个为红色,一个为绿色,另一个为蓝色。而CMYK类型的图像则由四个颜色成分组成:青C、品M、黄Y、黑K。CMYK类型的图像主要用于印穗茄刷行业。

将彩色图像转化成为灰度图像的过程称为图像的灰度化处理。

灰度化,在 RGB 模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。

彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255个值可取,这样一个像素点可以有1600多万(255 255 255)的颜色的变化范围。而灰度图像一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。

一般有四种方法对彩色图像进行灰度化处理:分量法、最大值法、平均值法、加权平均法。

图像灰度化处理有以下几种方式:

1. 分量法

将彩色图像中的三分量的亮度作为三个灰度图像的灰度宽陵值,可根据应用需要选取一种灰度图像。

2. 最大值法

将彩色图像中的三分量亮度的最大值作为灰度图的灰度值。

3. 平均值法

将彩色图像中的三分量亮度求平均得到一个灰度值。

4. 加权平均法

根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。

在Opencv中可以通过以上几种方法的数值计算来得到灰度图像也可以通过opencv提供的颜色空间转换函数来得到。

Opencv封装灰度法

先进行灰度化态乱,芹闭携IplImage* pImg = cvLoadImage( "C:\\1.bmp", 0 ) 这样嫌伏图像已经灰度化,然后调用cvThreshold(image, image, 125, 255, CV_THRESH_BINARY) 就可以了,125那里是你所用的阈值,这就是最简单的二值化,你要用ostu,或者别的高级一点的,就要自己写函数了

1、可以变成灰度图也可以不变。这里假设你的图像都是IPL_DEPTH_8U类型。

2、如果变成灰度图,就是单通道图像,获取的就是每一个像素点的灰度值。

IplImage* img = cvLoadImage("test.bmp", 0)

for (int i = 0i <img->heighti++)

{

for (int j = 0j <img->widthj++)

{

//方法一:使用cvGet2D()函数间接访问

CvScalar s = cvGet2D(img, i, j) //其中i代表y轴(第i行),即height;j代表x轴(第j列),即width。

printf("gray value=%f\n",s.val[0])

//方法二:使用直接访问

uchar val = ((uchar *)(img->imageData + i*img->widthStep))[j] //i和j的意义同上

printf("gray value=%d\n",val)

}

}

3、如果不变成灰度图,就是3通道图像,获取的就是每一个像素点的BGR值,然后分别获取烂颂B值,G值和R值。

IplImage* img = cvLoadImage("test.bmp", 1)

for (int i = 0i <img->heighti++)

{

for (int j = 0j <img->行扒widthj++)

{

//方法一:使用cvGet2D()函数间接访问

CvScalar s=cvGet2D(img,i,j)//其中i代表y轴(第i行),即height;j代表x轴(第j列),即width。

printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]) //注意是BGR顺序

//方法二:使用直接访问

int bVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]// B

int gVal = ((uchar *)(img->饥带郑imageData + i*img->widthStep))[j*img->nChannels + 1]// G

int rVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]// R

printf("B=%d, G=%d, R=%d\n",bVal,gVal,rVal) //注意是BGR顺序

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12469590.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存