我正在尝试使用opencv将图像转换为双精度。我试图在c ++中模仿MATLAB中可用的im2double函数。所以,为此我所做的是......
Mat IMG = imread("lena.bmp");
Size size(8,8);
Mat img,img_re,grey;
cvtColor( IMG, img, CV_BGR2GRAY );
resize(img,img_re,size);
img_re.convertTo( grey, CV_64FC3, 1.0/255.0 );
std::cout<<grey<<std::endl;
unsigned char *input = (unsigned char*)(grey.data);
grey: [0.3764705882352941, 0.5176470588235293, 0.4352941176470588, 0.8274509803921568;
0.392156862745098, 0.5254901960784314, 0.7372549019607844, 0.6431372549019607;
0.4431372549019608, 0.6431372549019607, 0.7176470588235294, 0.5607843137254902;
0.5333333333333333, 0.3254901960784314, 0.6862745098039216, 0.8431372549019608]
以灰色存储的数据几乎与从matlab获得的数据相似。像素的范围为[0,1]。但是,我的问题从这里开始。我现在想要从'灰色'访问像素值并将其保存到增强矩阵。 所以对于这个我使用..
for (unsigned i=0; i < height; ++i)
{
for (unsigned j=0; j < width; ++j )
{
image(i,j) = input[grey.step * j + i ];
}
}
image:: [4,4]((24,24,144,144),(24,24,144,144),(24,216,144,224),(24,63,144,63))
在此步骤之后,矩阵中的所有值都具有[0,255]的范围。灰度图像在[0,255]之间,但为什么在第一种情况下得到[0,1]之间的值。
答案 0 :(得分:2)
请远离访问Mat的原始数据&#39;指针,并使用:
grey.at<double>(i,j);
代替。
另外,如果im_re是1通道,灰度图像,你的typeflag是错误的,应该是:
img_re.convertTo( grey, CV_64F, 1.0/255.0 );