为什么我的 imshow 与 imwrite 不同
why my imshow differs from imwrite
我在 VS2013 上使用 OpenCV 2.4.8。我有以下代码片段:
Mat img_sum = Mat::zeros(img_gray.size(), CV_32F);
char file_name[FILENAME_MAX];
for (int i = 0; i < SCALE_SIZE; i++){
for (int j = 0; j < ORIENTATION_SIZE; j++){
Mat srcImg;
g_gabor[i*ORIENTATION_SIZE + j].conv_img(img_gray, srcImg, CV_GABOR_REAL);
memset(file_name, NULL, FILENAME_MAX);
sprintf_s(file_name, "gabor_images/%d_%d.png", i, j);
imwrite(file_name, srcImg);
imshow("Gabor滤波结果", srcImg); //此时srcImg.type() == 1
waitKey(100);
}
}
imwrite("img_sum.png", img_sum);
关键问题是imwrite和imshow的结果。他们给了我不同的结果。
imshow 图片:
imshow image
并且,imwrite 图像:
imwrite image
我想知道是不是图像类型的原因。如果是这样,如何转换图像类型来解决问题。
使用类型 CV_32F
,在使用 imwrite 之前必须将图像乘以 255。
尝试imwrite(file_name, 255 *srcImg);
。
当您首先转换为 CV_8U
时,例如 convertTo(dst, type, scale, shift)
,您可以确定两者是相同的。
现在我用OpenCV函数convertTo解决了我的问题。不仅是TYPE的问题,还需要scale和shift。
double minVal, maxVal;
minMaxLoc(srcImg, &minVal, &maxVal); //find minimum and maximum intensities
Mat charImage;
srcImg.convertTo(charImage, CV_8U, 255.0 / (maxVal - minVal), -minVal);
imwrite(file_name, charImage);
imshow("Gabor滤波结果", srcImg); //此时srcImg.type() == 1
我在 VS2013 上使用 OpenCV 2.4.8。我有以下代码片段:
Mat img_sum = Mat::zeros(img_gray.size(), CV_32F);
char file_name[FILENAME_MAX];
for (int i = 0; i < SCALE_SIZE; i++){
for (int j = 0; j < ORIENTATION_SIZE; j++){
Mat srcImg;
g_gabor[i*ORIENTATION_SIZE + j].conv_img(img_gray, srcImg, CV_GABOR_REAL);
memset(file_name, NULL, FILENAME_MAX);
sprintf_s(file_name, "gabor_images/%d_%d.png", i, j);
imwrite(file_name, srcImg);
imshow("Gabor滤波结果", srcImg); //此时srcImg.type() == 1
waitKey(100);
}
}
imwrite("img_sum.png", img_sum);
关键问题是imwrite和imshow的结果。他们给了我不同的结果。
imshow 图片: imshow image
并且,imwrite 图像: imwrite image
我想知道是不是图像类型的原因。如果是这样,如何转换图像类型来解决问题。
使用类型 CV_32F
,在使用 imwrite 之前必须将图像乘以 255。
尝试imwrite(file_name, 255 *srcImg);
。
当您首先转换为 CV_8U
时,例如 convertTo(dst, type, scale, shift)
,您可以确定两者是相同的。
现在我用OpenCV函数convertTo解决了我的问题。不仅是TYPE的问题,还需要scale和shift。
double minVal, maxVal;
minMaxLoc(srcImg, &minVal, &maxVal); //find minimum and maximum intensities
Mat charImage;
srcImg.convertTo(charImage, CV_8U, 255.0 / (maxVal - minVal), -minVal);
imwrite(file_name, charImage);
imshow("Gabor滤波结果", srcImg); //此时srcImg.type() == 1