これと同様の質問があるようですが、私が求めていることに静かに答えないでください。ここに私の質問があります。
OpenCV を使用した C++ で、以下に示すコードを実行すると、平均ピクセル値 6.32 が返されます。ただし、画像を開いて MATLAB で mean 関数を使用すると、約 6.92ish の平均ピクセル強度が返されます。ご覧のとおり、OpenCV の値を double に変換してこの問題を緩和しようとしたところ、openCV がイメージを一連の整数としてロードするのに対し、MATLAB はイメージを 10 進数値としてロードすることがわかりました。 . 私の質問は、コーディングが初めてなので、どちらが正しいですか? 私は、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;
}