我看到有类似的问题,但不要安静回答我的问题所以这是我的问题.
在使用OpenCV的C++中,我运行下面将提供的代码,它返回的平均像素值为6.32.但是,当我打开图像并在MATLAB中使用均值函数时,它返回的平均像素强度约为6.92ish.正如您所看到的,我将OpenCV值转换为double以尝试缓解此问题,并发现openCV将图像作为一组整数加载,而MATLAB将图像加载为十进制值,这些值与整数大致相当但不完全相同.所以我的问题是,对编码不熟悉,这是正确的吗?我假设MATLAB返回更准确的值,如果是这种情况,我想知道是否有办法以相同的方式加载图像以避免差异.
谢谢,代码如下
Mat img = imread("Cells2.tif");
cv::cvtColor(img, img, CV_BGR2GRAY);
cv::imshow("stuff",img);
Mat dst;
if(img.channels() == 3)
{
img.convertTo(dst, CV_64FC1);
}
else if (img.channels() == 1)
{
img.convertTo(dst, CV_64FC1);
}
cv::imshow("output",dst/255);
int NumPixels = img.total();
double avg;
double c = 0;
double std;
for(int y = 0; y < dst.cols; y++)
{
for(int x = 0; x < dst.rows; x++)
{
c+=dst.at<double>(x,y)*255;
}
}
avg = c/NumPixels;
cout << "asfa = " << c << endl;
double deviation;
double var;
double z = 0;
double q;
//for(int a = 0; a<= img.cols; a++)
for(int y = 0; y< dst.cols; y++)
{
//for(int b = 0; b<= dst.rows; b++)
for(int x = 0; x< dst.rows; x++)
{
q=dst.at<double>(x,y);
deviation = q - avg;
z = z + pow(deviation,2);
//cout << "q = " << q << endl;
}
}
var = z/(NumPixels);
std = sqrt(var);
cv::Scalar avgPixel = cv::mean(dst);
cout << "Avg Value = " << avg << endl;
cout << "StdDev = " << std << endl;
cout << "AvgPixel =" << avgPixel;
cvWaitKey(0);
return 0;
Run Code Online (Sandbox Code Playgroud)
}
根据您的评论,图像似乎以16位深度存储.MATLAB按原样加载TIFF图像,而默认情况下,OpenCV将图像加载为8位.这可能解释了您所看到的精度差异.
使用以下命令在OpenCV中打开图像:
cv::Mat img = cv::imread("file.tif", cv::IMREAD_ANYDEPTH|cv::IMREAD_ANYCOLOR);
Run Code Online (Sandbox Code Playgroud)
在MATLAB中,它只是:
img = imread('file.tif');
Run Code Online (Sandbox Code Playgroud)
接下来,您需要了解您正在使用的数据类型.在OpenCV中它的CV_16U,在MATLAB中uint16.因此,您需要相应地转换类型.
例如,在MATLAB中:
img2 = double(img) ./ double(intmax('uint16'));
Run Code Online (Sandbox Code Playgroud)
会将其转换为double值为[0,1]的图像
| 归档时间: |
|
| 查看次数: |
2979 次 |
| 最近记录: |