使用opencv中的方法进行图像保存时,出现保存的图像全黑的问题

最近在做的工作,需要对图像进行预处理,所以在尝试学习使用opencv。今天在进行gamma校正去除阴影时,发现保存的校正后的图像是全黑的。

因为是做农业图像处理,所以就随手拍了个玉米粒的图像(如下左图),可以看出玉米粒周围有阴影。在进行gamma处理后,用cv2.imshow()方法显示处理后的图像(如下右图),姑且不论处理好坏

                  

用cv2.imwrite()直接保存,打开后显示如下,怎么全黑啊!

搜了各种方法{什么版本问题,保存图像的方法不一样(有的保存方法是.saveImage()等等)}也没解决,后来打印了一下处理后的图像矩阵,发现如下

貌似像素值被标准化还是归一化了(错了请指正),于是把处理后的图像矩阵都扩展回0~255之间,最终保存的图像如下

本人新手,如有错误欢迎指正和探讨!

                      

如果将 `.mat` 文件转换为图像时出现全黑的情况,可能是以下几个原因: 1. 数据类型不匹配:在将 `.mat` 文件中的数据转换为 OpenCV 中的 `cv::Mat` 对象时,需要确保数据类型匹配。例如,如果 `.mat` 文件中的数据类型是 `double`,则需要使用 `CV_64F` 数据类型创建 `cv::Mat` 对象。 2. 值范围不正确:在将 `.mat` 文件中的数据转换为图像时,需要确保将数据值映射到正确的范围内。例如,如果数据值的范围在 `[0, 1]` 之间,则需要将其乘以 `255`,并将数据类型设置为 `CV_8UC1` 或 `CV_8UC3`。 3. 数据读取错误:在读取 `.mat` 文件时,需要确保正确地读取了图像数据。可以使用 MATLAB 或 Python 等工具检查 `.mat` 文件中的数据是否正确。 以下是一个示例代码,展示了如何将 `.mat` 文件中的数据转换为图像保存为 PNG 格式: ``` #include <opencv2/opencv.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <iostream> #include "mat.h" int main() { // load the .mat file MATFile *file = matOpen("image.mat", "r"); mxArray *data = matGetVariable(file, "image_data"); // get the image dimensions const mwSize *dims = mxGetDimensions(data); int rows = (int)dims[0]; int cols = (int)dims[1]; // create a cv::Mat object and copy the data cv::Mat image(rows, cols, CV_64FC3, mxGetData(data)); // convert the image to 8-bit format and save as PNG file cv::Mat output_image; image.convertTo(output_image, CV_8U, 255.0); cv::imwrite("output_image.png", output_image); // release the resources mxDestroyArray(data); matClose(file); return 0; } ``` 在上面的代码中,假设 `.mat` 文件中的数据类型为 `double`,并保存在变量 `image_data` 中。代码将图像数据复制到一个 `cv::Mat` 对象中,并使用 `cv::convertTo()` 函数将其转换为 `CV_8U` 数据类型,范围在 `[0, 255]` 之间。最后,使用 `cv::imwrite()` 函数将图像保存为 PNG 格式的文件。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值