读取图像中的像素值并保存在 OpenCv 文件中

Posted

技术标签:

【中文标题】读取图像中的像素值并保存在 OpenCv 文件中【英文标题】:Read value of pixel in a image and save on file OpenCv 【发布时间】:2016-02-23 14:27:13 【问题描述】:

我使用代码读取图像(彩色或灰度),如果它是彩色的,则将其转换为灰度,读取每个像素,然后保存在 txt 文件中但我有一个问题。 当我运行程序时,它返回了这个错误:

OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor, file C:\builds\2_4_PackSlave-win32-vc12-shared\opencv\modules\imgproc\src\color.cpp, line 3737

问题出在哪里? 我发布代码:

#include <opencv2/opencv.hpp>
using namespace cv;

#include <fstream>
using namespace std;


int main(int argc, char** argv)

    Mat colorImage = imread("aust.jpg");

    // First convert the image to grayscale.
    Mat grayImage;
    cvtColor(colorImage, grayImage, CV_RGB2GRAY);

    // Then apply thresholding to make it binary.
    Mat binaryImage(grayImage.size(), grayImage.type());


    // Open the file in write mode.
    ofstream outputFile;
    outputFile.open("Myfiles.txt");

    // Iterate through pixels.
    for (int r = 0; r < grayImage.rows; r++)
    
        for (int c = 0; c < grayImage.cols; c++)
        
            int pixel = grayImage.at<uchar>(r, c);

            outputFile << pixel << " ";
        
        outputFile << "-1 ";
    

    // Close the file.
    outputFile.close();
    return 0;

我尝试读取这样的图像:

感谢大家的帮助。

【问题讨论】:

【参考方案1】:

您可以直接将图像加载为灰度,因此您无需手动进行转换:

Mat grayImage = imread("aust.jpg", CV_LOAD_IMAGE_GRAYSCALE);

如果您想读取彩色图像然后转换为灰度图像,您应该调用带有CV_LOAD_IMAGE_COLOR 标志的cv::imread


顺便说一句,评论下面的行

// Then apply thresholding to make it binary.

不应用阈值。我猜你打算使用cv::threshold

【讨论】:

【参考方案2】:

错误表示cvtColor的输入图像不是3或4通道图像。请检查频道数:

colorImage.channels();

还请注意,您应该使用COLOR_BGR2GRAY,而不是COLOR_RGB2GRAY。 OpenCV 中的默认顺序是 BGR,而不是 RGB。

COLOR_XXX2YYY 是新名称,IMREAD_XXX 是以后使用的。


如前所述,您可以直接将图像加载为灰度,使用:

Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);

要以csv格式存储数据,可以使用cv::format函数:

Mat1b gray;
cvtColor(img, gray, COLOR_BGR2GRAY);

ofstream out("Myfiles.txt");
out << cv::format(gray, "csv");

或者您可以使用FileStorage,或save the binary data。

【讨论】:

以上是关于读取图像中的像素值并保存在 OpenCv 文件中的主要内容,如果未能解决你的问题,请参考以下文章

opencv之python版图像的读取显示保存像素遍历以及结合matplotlib使用

如何标准化图像中的像素值并保存

opencv读取ENVI标准格式

opencv如何读取多边形区域内的像素值?

OpenCV学习笔记3基础:图像基本操作

OpenCV学习笔记3基础:图像基本操作