针对opencv的提问!!!浮点型图像像素值范围是多少?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了针对opencv的提问!!!浮点型图像像素值范围是多少?相关的知识,希望对你有一定的参考价值。

书上写着是[0-1]。
但是我看到例程的代码是这样写的:
IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
int height = img->height;
int width = img->width;
int step = img->widthStep/sizeof(float);
int channels = img->nChannels;
float * data = (float *)img->imageData;
data[i*step+j*channels+k] = 111;
请问这是为什么???给100分吧!
既然是[0-1]
怎么可以被赋值111呢?很是奇怪!!!

书上写0-1没错,因为如果你要用imshow查看图像的话,浮点图像的数值范围必须是0-1才有意义,才能正常查看图像,当然如果你的浮点图像是作为中间运算结果,那么取什么值是都可以的,你只要明确一点,作为浮点图像,只有在范围0-1上才是真正意义上的图像,才能用imshow查看,否则你的浮点图像不能正常显示,但是可以用作中间计算结果,希望我的回答对你有用。 参考技术A 这个问题很简单啊,首先data 是opencv数据存放的区域,是不可见的。data[i*step+j*channels+k] = 111;这句话的意思就是对某个点赋值啊,一点问题都没有。不知道你为什么说是[0-1]的范围,i就是第几行,j是什么通道(opencv是BGR的通道哦,和常规的RGB相反的),k是这行第几个元素。这个元素可以赋值32位的浮点,当然赋值111也是可以的喽。

书上写着是[0-1]是指的什么,原来的图像时2值化的吗?有些时候为了计算光流啊什么的,需要再做一副32F的图像的。
参考技术B IplImage *img=cvLoadImage("c://fruitfs.bmp",1);
CvScalar s;
for(int i=0;i<img->height;i++)...
for(int j=0;j<img->width;j++)...
s=cvGet2D(img,i,j); // get the (i,j) pixel value
printf("B=%f, G=%f, R=%f ",s.val[0],s.val[1],s.val[2]);
s.val[0]=111;
s.val[1]=111;
s.val[2]=111;
cvSet2D(img,i,j,s);//set the (i,j) pixel value


cvNamedWindow("Image",1);
cvShowImage("Image",img);
cvWaitKey(0); //等待按键
cvDestroyWindow( "Image" );//销毁窗口
cvReleaseImage( &img ); //释放图像
return 0;

Opencv利用Mat访问像素值

如果是采用Mat形式存储,想要访问灰度图像的灰度值,可以采用如下方法:

技术分享

如果是彩色图像,采用如下方法:

技术分享

 

说明:

其中gray_value中存放灰度值,image是读入的图像,i表示行,j表示列;

color_value中存放彩色像素值,iamge是读入的图像,i表示行,j表示列,k表示通道,即R、G、B,取值范围为2、1、0.

以上是关于针对opencv的提问!!!浮点型图像像素值范围是多少?的主要内容,如果未能解决你的问题,请参考以下文章

图像质量评价指标之——PSNR和SSIM

OpenCV 读取图像并使用整数值管理它们的像素(如 matlab)

使用OpenCV如何获取图像每个像素的灰度值??

bilateralFilter(双边滤波操作)

opencv 怎么取到灰度图像的像素值,C++接口的

Opencv利用Mat访问像素值