我正在尝试编写将平场应用于图像的C++程序。应该加载一个图像并将其除以另一个加载的图像,然后将其导出为PNG。我的程序可以正确编译,但是只能生成全黑图像。
#include <climits>
#include <stdio.h>
#include <string>
#include <opencv/cv.h>
#include <opencv/highgui.h>
using namespace cv;
using namespace std;
int main( int argc, char *argv[] )
{
const char *flat_file = argv[1];
const char *img_file = argv[2];
const char *out_file = argv[3];
Mat flat_img;
flat_img = imread( flat_file, CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH );
Mat image;
image = imread( img_file, CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH );
GaussianBlur( flat_img, flat_img, cv::Size(3,3), 0, 0, BORDER_REPLICATE );
divide( image, flat_img, image, 1.0, -1 );
imwrite( out_file, image );
return 0;
}
所有输入文件均为16位TIFF。当前,生成的输出文件是16位PNG,具有正确的像素尺寸,但全黑。
我对C++和OpenCV都是新手,因此我不确定自己缺少什么。 This thread似乎表明可能是浮点值。我可以转换为浮点数,但是我需要保持源代码的16位性质。我试过在除法命令后添加
image.convertTo( image, CV_16U );
行,同时使用CV_16U
和CV_8U
都行不通。任何帮助都将不胜感激!
编辑
根据以下建议,我尝试添加一些imshow命令以实际测试opencv是否正确处理了事情。似乎一切正常,直到我的除法命令为止。之后,我的图像数组最终变成空白。
最佳答案
原来这确实是我的除法命令。我将代码基于同事编写的类似应用程序,因此我去看看他们是如何进行划分的。我不确定100%会完成什么,但是当我将鸿沟更改为这一点时,它会起作用:divide( image, flat_img, image, image.depth() == 16 ? UCHAR_MAX : USHRT_MAX );
只是做一个预测,该条件就是根据图像的深度为我的数据设置标量。我仍然有一个挥之不去的问题,就是我所拥有的和divide( image, flat_img, image, image.depth() == 8 ? UCHAR_MAX : USHRT_MAX );
之间的区别是什么。两者都产生看起来相同的图像。通常,我试图了解正在发生的事情更好一些。