OPENCV IMWRITE保存黑色PNG
OpenCV imwrite saving black png
我正在尝试编写一个将flatfield应用于图像的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位tiffs。当前,结果输出文件是一个16位PNG,具有正确的像素尺寸,但完全是黑色的。
我对C 和OpenCV都很新,所以我不确定我缺少什么。该线程似乎表明可能是原因。我可以转换出浮点,但是我需要保持来源的16位本质。我尝试使用 CV_16U
和 CV_8U
的divide命令之后添加一行image.convertTo( image, CV_16U );
,并且两者都没有起作用。
任何帮助都非常感谢!
编辑
根据下面的建议,我尝试添加一些IMShow命令来实际测试OpenCV正确处理内容。似乎一切正常,直到我的Divide命令为止。之后,我的图像数组最终只是空白。
事实证明这确实是我的divide命令。我一直以同事编写的类似申请为基础,所以我去研究了他们是如何完成该部门的。我不是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 );
的区别是什么。两者都产生似乎是同一图像的东西。大多数情况下,我试图了解情况更好。
答案可能是您的图像已经正确了,因为如果您使用普通图像浏览器打开16位图像,则通常是完全黑暗的,因为它们仅支持正确显示8位图像。
要管理此问题,首先尝试使用OpenCV Highgui显示16位图像。您可以执行imshow("test",image) ; waitKey(0) ;
,看看是否正确显示图像。如果是这样,您可以通过Mat img8bit ; image.convertTo(img8bit, CV8U, 255./65535.) ;
将图像转换为8bit,然后Imwrite此新垫子。
- 在CToolBar对象中使用PNG时出现问题
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- 除非重新绘制大小,否则SDL_Texture在调整大小后呈现黑色
- 使用 stbi_write_png,如何将 0 和 1 的矩形字节数组转换为单色 png 文件?
- 为什么我会得到黑色纹理?
- 将 FFMPEG 帧写入 png/jpeg 文件
- 具有 GPU 时间表的卤化物产生黑色图像
- 将位图 (bmp) 转换为具有透明度的 png (Windows c++)
- OpenGL只是渲染一个黑色的方块
- 如何启用libMagick++以保存.png文件格式
- Qt-png图像未显示在部署应用程序中
- 无法在CLion(macOS)上打开带有CImg的.png文件
- C++gdi::内存中的位图到PNG图像
- 当我调用它来解码 Blob 对象中的 png 图像时,"Magick++::readImages"引发警告
- 黑色纹理,如果图片大小在第二个 OpenGL 线程中> 1 * 1
- 如何将 2d 数组转换为 svg 或 png 格式的数独图像?
- GUID variable for JPEG,BMP,PNG
- OPENCV IMWRITE保存黑色PNG
- 从libpng加载的png纹理在OpenGL中显示为黑色
- 加载RGB PNG会导致黑色图像