Я относительно новичок в C ++ и кодировании в целом и столкнулся с проблемой при попытке преобразовать изображение в изображение с плавающей запятой. Я пытаюсь сделать это, чтобы устранить ошибки округления, вычисляя среднее и стандартное отклонение интенсивности пикселей для изображений, поскольку это начинает оказывать существенное влияние на данные. Мой код ниже.
Mat img = imread("Cells2.tif");
cv::namedWindow("stuff", CV_WINDOW_NORMAL);
cv::imshow("stuff",img);
CvMat cvmat = img;
Mat dst = cvCreateImage(cvGetSize(&cvmat),IPL_DEPTH_32F,1);
cvConvertScale(&cvmat,&dst);
cvScale(&dst,&dst,1.0/255);
cvNamedWindow("Test",CV_WINDOW_NORMAL);
cvShowImage("Test",&dst);
И я сталкиваюсь с этой ошибкой
Ошибка OpenCV: неверный аргумент (массив должен быть CvMat или IplImage) в неизвестной функции, файл …… \ modules \ core \ src \ array.cpp, строка 1238
Я посмотрел везде, и все говорили, чтобы конвертировать IMG в CvMat, что я пытался выше.
Когда я сделал это, как показано выше код, я получаю
Ошибка OpenCV: неверный аргумент (неизвестный тип массива) в неизвестной функции, файл …… \ modules \ core \ src \ matrix.cpp строка 697
Заранее благодарны за Вашу помощь.
Просто используйте интерфейс C ++ OpenCV вместо интерфейса C и используйте convertTo
функция для преобразования между типами данных.
Mat img = imread("Cells2.tif");
cv::imshow("source",img);
Mat dst; // destination image
// check if we have RGB or grayscale image
if (img.channels() == 3) {
// convert 3-channel (RGB) 8-bit uchar image to 32 bit float
src.convertTo(dst, CV_32FC3);
}
else if (img.channels() == 1) {
// convert 1-chanel (grayscale) 8-bit uchar image to 32 bit float
img1.convertTo(dst, CV_32FC1);
}
// display output, note that to display dst image correctly
// we have to divide each element of dst by 255 to keep
// the pixel values in the range [0,1].
cv::imshow("output",dst/255);
waitKey();
Вторая часть вопроса Чтобы рассчитать среднее значение всех элементов в dst
cv::Salar avg_pixel;
double avg;
// note that Scalar is a vector.
// If your image is RGB, Scalar will contain 3 values,
// representing color values for each channel.
avg_pixel = cv::mean(dst);
if (dst.channels() == 3) {
//if 3 channels
avg = (avg_pixel[0] + avg_pixel[1] + avg_pixel[2]) / 3;
}
if(dst.channels() == 1) {
avg = avg_pixel[0];
}
cout << "average element of m: " << avg << endl;
Вот мой код для расчета среднего в C ++ OpenCV.
int NumPixels = img.total();double avg;
double c;
for(int y = 0; y <= img.cols; y++)
for(int x = 0; x <= dst.rows; x++)
c+=img.at<uchar>(x,y);
avg = c/NumPixels;
cout << "Avg Value\n" << 255*avg;
Для MATLAB я просто загружаю изображение и беру Q = mean (img (:)); который возвращает 1776,23
И для возвращения 1612.36 я использовал cv: Scalar z = mean (dst);