[英]OpenCV-2.4.8.2: imshow differs from imwrite
我在Mac OS 10.9.5上使用OpenCV2.4.8.2。 我有以下代碼片段:
static void compute_weights(const vector<Mat>& images, vector<Mat>& weights)
{
weights.clear();
for (int i = 0; i < images.size(); i++) {
Mat image = images[i];
Mat mask = Mat::zeros(image.size(), CV_32F);
int x_start = (i == 0) ? 0 : image.cols/2;
int y_start = 0;
int width = image.cols/2;
int height = image.rows;
Mat roi = mask(Rect(x_start,y_start,width,height)); // Set Roi
roi.setTo(1);
weights.push_back(mask);
}
}
static void blend(const vector<Mat>& inputImages, Mat& outputImage)
{
int maxPyrIndex = 6;
vector<Mat> weights;
compute_weights(inputImages, weights);
// Find the fused pyramid:
vector<Mat> fused_pyramid;
for (int i = 0; i < inputImages.size(); i++) {
Mat image = inputImages[i];
// Build Gaussian Pyramid for Weights
vector<Mat> weight_gaussian_pyramid;
buildPyramid(weights[i], weight_gaussian_pyramid, maxPyrIndex);
// Build Laplacian Pyramid for original image
Mat float_image;
inputImages[i].convertTo(float_image, CV_32FC3, 1.0/255.0);
vector<Mat> orig_guassian_pyramid;
vector<Mat> orig_laplacian_pyramid;
buildPyramid(float_image, orig_guassian_pyramid, maxPyrIndex);
for (int j = 0; j < orig_guassian_pyramid.size() - 1; j++) {
Mat sized_up;
pyrUp(orig_guassian_pyramid[j+1], sized_up, Size(orig_guassian_pyramid[j].cols, orig_guassian_pyramid[j].rows));
orig_laplacian_pyramid.push_back(orig_guassian_pyramid[j] - sized_up);
}
// Last Lapalcian layer is the same as the Gaussian layer
orig_laplacian_pyramid.push_back(orig_guassian_pyramid[orig_guassian_pyramid.size()-1]);
// Convolve laplacian original with guassian weights
vector<Mat> convolved;
for (int j = 0; j < maxPyrIndex + 1; j++) {
// Create 3 channels for weight gaussian pyramid as well
vector<Mat> gaussian_3d_vec;
for (int k = 0; k < 3; k++) {
gaussian_3d_vec.push_back(weight_gaussian_pyramid[j]);
}
Mat gaussian_3d;
merge(gaussian_3d_vec, gaussian_3d);
//Mat convolved_result = weight_gaussian_pyramid[j].clone();
Mat convolved_result = gaussian_3d.clone();
multiply(gaussian_3d, orig_laplacian_pyramid[j], convolved_result);
convolved.push_back(convolved_result);
}
if (i == 0) {
fused_pyramid = convolved;
} else {
for (int j = 0; j < maxPyrIndex + 1; j++) {
fused_pyramid[j] += convolved[j];
}
}
}
// Blending
for (int i = (int)fused_pyramid.size()-1; i > 0; i--) {
Mat sized_up;
pyrUp(fused_pyramid[i], sized_up, Size(fused_pyramid[i-1].cols, fused_pyramid[i-1].rows));
fused_pyramid[i-1] += sized_up;
}
Mat final_color_bgr;
fused_pyramid[0].convertTo(final_color_bgr, CV_32F, 255);
final_color_bgr.copyTo(outputImage);
imshow("final", outputImage);
waitKey(0);
imwrite(outputImagePath, outputImage);
}
該代碼對2張圖像進行了一些基本的金字塔混合。 關鍵問題與最后一行中的imshow和imwrite有關。 他們給了我截然不同的結果。 對於顯示如此長/混亂的代碼,我深表歉意,但我擔心這種差異來自代碼的其他某些部分,這些其他部分隨后可能會影響顯示和寫入。
基於給定的代碼,第一幅圖像顯示了imwrite的結果,第二幅圖像顯示了imshow的結果。 我很困惑為什么會這樣。
我還注意到當我執行這些操作時:
Mat float_image;
inputImages[i].convertTo(float_image, CV_32FC3, 1.0/255.0);
imshow("float image", float_image);
imshow("orig image", image);
它們顯示的是完全相同的東西,也就是說,它們都在原始rgb圖像(在圖像中)中顯示相同的圖片。
IMWRITE功能
默認情況下, imwrite會將輸入圖像轉換為僅8位(在PNG,JPEG 2000和TIFF情況下為16位無符號(CV_16U))單通道或3通道(“ BGR”通道順序)圖像可以使用此功能保存 。 因此,無論您輸入哪種格式進行寫入,它都會以BGR格式盲目轉換為CV_8U,范圍為0(黑色)-255(白色)。
IMSHOW-問題
因此,當注意到您的函數時, fused_pyramid[0].convertTo(final_color_bgr, CV_32F, 255);
fused_pyramid已在墊子類型21(浮點CV_32F)下。 您嘗試使用比例因子255轉換為浮點。此比例因子255導致問題@ imshow。 取而代之的是,您可以直接輸入fused_pyramid而不進行轉換,因為它已經縮放到0.0(黑色)-1.0(白色)之間的浮點數。
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.