彩图变灰度图 rgb2gray
已知变换曲线的话 直接将原始图的灰度值代入函数式进行变换即可
需要注意的是图形数据类型
I = imread('E:\Fig1ajpg');
[d1,d2,d3] = size(I);
if(d3 > 1)
I = rgb2gray(I);%如果是灰度图就不用先变换
end
I = double(I) / 255;
I1 = uint8(255 I 05 + 05);
imshow(I1);imwrite(I,'testjpg')
您好,灰度直方图是一种描述图像亮度分布的方法,它显示了图像中每个灰度级别的像素数量。如果已知灰度直方图,可以通过反推计算出图像的原始函数。
首先,将灰度直方图归一化,即将每个灰度级别的像素数量除以图像总像素数,得到每个灰度级别的像素占比。然后,将这些占比依次累加,得到一个累积分布函数(CDF)。这个函数表示的是小于等于某个灰度级别的像素占总像素数的比例。最后,将CDF函数进行线性变换,将其映射到期望的输出范围内(通常是0到255),即可得到原始函数。
具体地,假设灰度级别的范围是0到L-1,对应的像素占比为p0, p1, , pL-1,CDF函数为c0, c1, , cL-1,原始函数为f(x),则有:
c0 = p0
c1 = p0 + p1
c2 = p0 + p1 + p2
cL-1 = p0 + p1 + + pL-1
f(x) = (L-1) (c(x) - cmin) / (1 - cmin)
其中,c(x)表示CDF函数在灰度级别x处的取值,cmin表示CDF函数的最小值(即第一个非零值),L-1是灰度级别的最大值,f(x)是原始函数在灰度级别x处的取值。
通过这个公式,就可以通过已知灰度直方图求出原始函数。
cvCvtColor(),是Opencv里的颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间的转换,也可以转换为灰度图像。
函数原型:void cvCvtColor( const CvArr src, CvArr dst, int code );
参数:
src 输入的 8-bit,16-bit或 32-bit单倍精度浮点数影像。
dst 输出的8-bit, 16-bit或 32-bit单倍精度浮点数影像。
code
色彩空间转换的模式,该code来实现不同类型的颜色空间转换。比如CV_BGR2GRAY表示转换为灰度图,CV_BGR2HSV将从RGB空间转换为HSV空间。其中当code选用CV_BGR2GRAY时,dst需要是单通道。当code选用CV_BGR2HSV时,对于8位图,需要将RGB值归一化到0-1之间。这样得到HSV图中的H范围才是0-360,S和V的范围是0-1。
例子:
IplImage src = cvLoadImage("4085_1jpg",1);//原图IplImage dst_gray = cvCreateImage(cvGetSize(src),src->depth,1);//灰度图
IplImage dst_image = cvCreateImage(cvGetSize(src),32,src->nChannels);
IplImage src_image_32 = cvCreateImage(cvGetSize(src),32,src->nChannels);
//这两个图需要是32浮点位的,因为对原图进行归一化后得到的是浮点数
cvCvtColor(src,dst_gray,CV_BGR2GRAY);//得到灰度图
cvConvertScale(src,src_image_32,10/2550,0);//将原图RGB归一化到0-1之间
cvCvtColor(src_image_32,dst_image,CV_BGR2HSV);//得到HSV图
求平均灰度很简单,假设你图像数据放在变量I中
I=double(I);
[M N]=size(I);
ave=sum(sum(I))/(MN); %ave为平均灰度。
也可以直接用下面的一条语句:
ave=mean(mean(I));
你这样发贴,谁知道是怎么回事
也不说清楚,你说的CDib应该是你自己做的一个类吧还是别人事先做好的一个类MFC里没有这个类的
问的问题太笼统,直接问人要函数代码
给个提示:
研究下BITMAPINFO数据结构然后在上次你贴的那段代码的基础上做下修改:
把对调色板颜色的修改,直接改为对Bits像素数组的修改,改法是差不多的
真不知道,你改256色位图的代码是不是你写的,是你写的,怎么就不会变通呢不是你写的,就说明你对那段代码根本看不明白,先研究研究那段代码吧!
=============================================================
补充:
if (lpbmi->bmiHeaderbiBitCount != 24) {
//不是真彩图,改调色板。
} else {
//是真彩图,改lpDIBBits中的位图数据。
PBYTE lpLast = (PBYTE)lpDIBBits + lpbmi->bmiHeaderbiSizeImage;
PBYTE lpCur = (PBYTE)lpDIBBits;
while (lpCur < lpLast) {
lpCur++ = (lpCur) 0299;
lpCur++ = (lpCur) 0587;
lpCur++ = (lpCur) 0114;
}
}
//位图现在一般是4中,单色位图(biBitCount==1),16色位图(biBitCount==4),256色位图(biBitCount==8),24位真彩图(biBitCount==24)。
前3种有调色板,因此位于lpDIBBits的位图数据其实存的调色板的索引值。24位图无调色板,是用3个字节来存储实际的颜色。
PS我可没说没有256色位图--“虽然说现在真彩色居多,不代表256色位图就没有。”,我说的是你的DIB漏了很重要的一部分。这样就全补全了。我用了你的灰度数据,改出来的效果如图,是这样吗?
==========================================
float hue = 01;//03||05||07,随便用了点颜色。
lpCur++ = (lpCur) hue;
lpCur++ = (lpCur) hue;
lpCur++ = (lpCur) hue;
cvCvtColor(),是Opencv里的颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间的转换,也可以转换为灰度图像。
参数CV_RGB2GRAY是RGB到gray。
具体用的线性灰度变换函数是:
Gray=0299R+0587G+0144B
你可以通过查看OpenCV的documentation或者源代码,来了解具体的实现。
matlab提供了现成的函数
graycomatrix生成共生矩阵
graycoprops计算其特征值
具体用法:
glcm = graycomatrix(I)
从图像I创建灰度共生矩阵glcm。通过计算具有灰度级i和灰度级j的像素对在水平方向相邻出现的频繁程度。glcm中的每个元素说明了水平方向相邻像素对出现的次数。如果灰度级为L则glcm的维数为LL。
2glcms = graycomatrix(I,param1,val1,param2,val2,)
根据参数对的设定,返回一个或多个灰度共生矩阵。
参数说明:
'GrayLimits':灰度界限,为二元向量[low high]。灰度值小于等于low 时对应1,大于等于high时对应于灰度级。如果参数设为[],则共生矩阵使用图像的最小和最大灰度值作为界限,即[min(I(:)) max(I(:))]。
'NumLevels':整数,说明I中进行灰度缩放的灰度级数目。例如,如果NumLevel设为8,则共生矩阵缩放I中的灰度值使它们为1到8之间的整数。灰度级的数目决定了共生矩阵glcm的尺寸。缺省情况:数字图像:8;二进制图像:2。
'Offset':p行2列整型矩阵,说明感兴趣像素与其相邻像素之间的距离。每行是一个说明像素对之间偏移关系的二元向量[row_offset, col_offset]。行偏移row_offset是感兴趣像素和其相邻像素之间的间隔行数。列偏移同理。偏移常表达为一个角度,常用的角度如下:(其中D为像素距离)
角度 0 45 90 135
Offset [0,D] [-D D] [-D 0] [-D -D]
3[glcms,SI] = graycomatrix()
返回缩放图像SI,SI是用来计算灰度共生矩阵的。SI中的元素值介于1和灰度级数目之间。
graycoprops:得到灰度共生矩阵得到各种属性
stats = graycoprops(glcm, properties):从灰度共生矩阵glcm计算静态属性。glcm是mnp的有效灰度共生矩阵。如果glcm是一个灰度共生矩阵的矩阵,则stats是包括每个灰度共生矩阵静态属性的矩阵。
graycoprops正规化了灰度共生矩阵,因此元素之和为1。正规化的GLCM中的元素(r,c)是具有灰度级r和c的定义的空间关系的像素对的联合概率。Graycoprops使用正规化的GLCM来计算属性。
属性参数如下:
1 'Contrast' : 对比度。返回整幅图像中像素和它相邻像素之间的亮度反差。取值范围:[0,(GLCM行数-1)^2]。灰度一致的图像,对比度为0。
2 'Correlation' : 相关。返回整幅图像中像素与其相邻像素是如何相关的度量值。取值范围:[-1,1]。灰度一致的图像,相关性为NaN。
3 'Energy' : 能量。返回GLCM中元素的平方和。取值范围:[0 1]。灰度一致的图像能量为1。
4 'Homogemeity' : 同质性。返回度量GLCM中元素的分布到对角线紧密程度。取值范围:[0 1]。对角矩阵的同质性为1。
以上就是关于matlab灰度变换对比度展宽问题,如何用程序转换啊~~如图全部的内容,包括:matlab灰度变换对比度展宽问题,如何用程序转换啊~~如图、已知灰度直方图如何求函数、opencv实现彩色图像向灰度图像转换的函数是哪个等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)