Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 为什么Matlab和OpenCV中的图像值不同?_Image_Matlab_Opencv_Image Processing - Fatal编程技术网

Image 为什么Matlab和OpenCV中的图像值不同?

Image 为什么Matlab和OpenCV中的图像值不同?,image,matlab,opencv,image-processing,Image,Matlab,Opencv,Image Processing,我有一个原始图像: 然后我阅读它,创建一个PSF,并在Matlab中模糊它: lenawords1=imread('lenawords.bmp'); %create PSF sigma=6; PSFgauss=fspecial('gaussian', 8*sigma+1, sigma); %blur it lenablur1=imfilter(lenawords1, PSFgauss, 'conv'); lenablurgray1=mat2gray(lenablur1); PSFgaussg

我有一个原始图像:

然后我阅读它,创建一个PSF,并在Matlab中模糊它:

lenawords1=imread('lenawords.bmp');
%create PSF
sigma=6;
PSFgauss=fspecial('gaussian', 8*sigma+1, sigma);

%blur it
lenablur1=imfilter(lenawords1, PSFgauss, 'conv');
lenablurgray1=mat2gray(lenablur1);
PSFgaussgray = mat2gray(PSFgauss);
我保存了模糊的图像:

imwrite(lenablurgray1, 'lenablur.bmp');
当我在其中显示一些值时,我得到

disp(lenablurgray1(91:93, 71:75))

0.5556    0.5778    0.6000    0.6222    0.6444
0.6000    0.6444    0.6667    0.6889    0.6889
0.6444    0.6889    0.7111    0.7333    0.7333
然后,我在OpenCV中打开模糊图像,并以相同的索引显示其值:

Mat img = imread("lenablur.bmp");

for (int r = 91; r < 94; r++) {
    for (int c = 71; c < 76; c++) {
        cout << img.at<double>(r, c) << " ";
    }
    cout << endl;
}
cout << endl;
为什么会这样

编辑:
img.at(r,c)
给出

1903260029 1533437542 ...
2004318088 ...
....
17 11 11 11 6
17 11 11 11 6
17 11 11 11 11
如果我将模糊图像保存为png文件:

imwrite(lenablurgray1, 'lenablur.png');
然后当我在OpenCV中阅读它时:

Mat img = imread("lenablur.png");
img.convertTo(img, CV_64F);
Mat kernel = imread("PSFgauss.bmp");
cvtColor(kernel, kernel, cv::COLOR_BGR2GRAY);
kernel.convertTo(kernel, CV_64F);

for (int r = 6; r < 9 ; r++) {
    for (int c = 6; c < 9; c++) {
        cout << kernel.at<double>(r, c) << " ";
    }
    cout << endl;
}
cout << endl;
然后
img.at(r,c)
给出

1903260029 1533437542 ...
2004318088 ...
....
17 11 11 11 6
17 11 11 11 6
17 11 11 11 11
仍然与Matlab中的值不匹配

EDIT2:我现在看到内核的值是错误的。在Matlab中,我得到

imwrite(PSFgaussgray, 'PSFgauss.bmp');
disp(PSFgaussgray(7:9, 7:9)*256)

.0316 .0513 .0812
.0513 ...
...
鉴于在OpenCV中:

Mat img = imread("lenablur.png");
img.convertTo(img, CV_64F);
Mat kernel = imread("PSFgauss.bmp");
cvtColor(kernel, kernel, cv::COLOR_BGR2GRAY);
kernel.convertTo(kernel, CV_64F);

for (int r = 6; r < 9 ; r++) {
    for (int c = 6; c < 9; c++) {
        cout << kernel.at<double>(r, c) << " ";
    }
    cout << endl;
}
cout << endl;

要理解您看到的差异,您需要了解MATLAB如何将图像保存到BMP或PNG文件,以及OpenCV如何读取图像

MATLAB假设,如果像这种情况一样,图像的类型为
double
,则其强度范围为[0,1]。也就是说,不希望像素值低于0且高于1。当保存到文件中时,这些图像将乘以255并转换为8位整数(其范围为[0255])

因此,如果

>> disp(lenablurgray1(91:93, 71:75))
0.5556    0.5778    0.6000    0.6222    0.6444
0.6000    0.6444    0.6667    0.6889    0.6889
0.6444    0.6889    0.7111    0.7333    0.7333
保存的是

>> uint8( lenablurgray1(91:93, 71:75) * 255 )

142   147   153   159   164
153   164   170   176   176
164   176   181   187   187
接下来,OpenCV将把这个文件读取为RGB(或者更确切地说是BGR,OpenCV笨拙的颜色顺序)和8位无符号整数(
CV_8U
)。要显示这些数据,请提取一个颜色通道,或使用转换为灰度值

cvtColor(img、img、cv::COLOR\u bgr2灰色);
然后,使用

img.at(r,c)
如果使用
img.at()
读取它们,则由8个连续像素组成的组将被视为一个像素值(一个
double
有8个字节)

接下来,请记住MATLAB的索引从1开始,而OpenCV的索引从0开始。因此,您的循环应该如下所示:

for(int r=90;r<93;r++){//匹配MATLAB的91:93索引
对于(int c=70;c<75;c++){//匹配MATLAB的71:75索引

如果您在图像中读取为无符号字符(BMP始终是8位无符号整数),您不能执行(r,c)
。那我该怎么办?类型必须与
img
对象中存储的数据类型相匹配。请参阅文档:是的,我知道。我在编辑中尝试了一些更改,但这些更改都不起作用。需要做更多更改:MATLAB索引从1开始,OpenCV从0开始。您需要调整您使用的索引。感谢cl但是,正如我在EDIT3中提到的,我现在注意到,当我在Matlab中使用
imfilter
和在OpenCV中使用
filter2D
时,两个值不匹配。
filter2D
的值似乎是错误的。这是为什么?@user5739619:请,请不要把这个问题变成一个移动的目标。请将这个最新的编辑作为一个新版本发布注意,您可以链接此问题以供参考。我很乐意回答。请包括一个MCVE,不清楚您使用什么作为
filter2D
的输入。谢谢!