从位图图像文件中读取像素数据值

Posted

技术标签:

【中文标题】从位图图像文件中读取像素数据值【英文标题】:Reading pixels data values from a bitmap image file 【发布时间】:2014-02-04 11:17:30 【问题描述】:

这是我用 C++ 编写的代码

  int main()
   
    Mat im = imread("C:/santhu/bitmap.bmp");

int rows = im.rows;
   int cols = im.cols;

cout<<"rows\n"<<rows;
cout<<"cols"<<cols;

if (im.empty()) 
 
     cout << "Cannot load image!" << endl;
    return -1;



cout<<"the output for matrix of pixels";

for (int i = 0; i <cols ; i++)

    Vec3b *ptr = im.ptr<Vec3b>(i);
    for (int j = 0; j < rows; j++)
       
        Vec3b pixel = ptr[j];
        cout<<pixel<<"\t";
    
    cout<<"\n";


getchar();
 imshow("Image", im);
waitKey(0);

代码工作正常,直到它显示每个像素值 Vec3b,但最后会出现像“Unhandled exception at 0x75afb9bc in san.exe: Microsoft C++ exception: cv::Exception at memory location 0x0043f9d0..”这样的异常提示窗口要求中断或继续流程

在命令控制台中,我正在获取要显示的像素值,在显示像素数据后,它显示为opencv error:assertion failed(y==0 ||(data &amp;&amp; dims)=1 &amp;&amp;(unsigned) y &lt;(unsigned)size.p[0] in cv::Mat::ptr,file c:\opencv\build\include\opencv2\core\mat.hpp,line 428

我检查了整个网络,mat.hpp 也给出了内联函数,所以我很沮丧,谁能解释一下这个错误(异常)并帮助我让代码运行,直到数据像素进入位图并很好地执行.plz

【问题讨论】:

您在没有检查或要求的情况下假设该数组包含 Vec3b 像素。 大卫,imread 的默认标志会强制它进入 CV_8UC3,所以没关系。 是的,这是真的..请发布解决方案,伙计们.. 【参考方案1】:

你在这里混淆了行和列。

for (int i = 0; i <rows; i++)       // rows, not cols

    Vec3b *ptr = im.ptr<Vec3b>(i);
    for (int j = 0; j < cols; j++)  // cols, not rows
       
        Vec3b pixel = ptr[j];
        cout<<pixel<<"\t";
    
    cout<<"\n";

【讨论】:

感谢 beark,你让我过得愉快..!!并且每个像素的输出都像[int,int,int],这里的问题是我如何永久访问和更改这些值并将其存储回同一个图像并使其显示..如果你可以ping一些链接会好的。并再次感谢最后一个答案。 使用参考:` Vec3b & pixel = ptr[j];像素[1] = 255;`现在绿色已满,或者只是ptr[j][1] = 255;【参考方案2】:

颜色格式

for(int j = 0; j < img.rows; j++) 
   for(int i = 0; i < img.cols; i++) 

      uchar b = img.ptr<cv::Vec3b>(j)[i][0];
      ucahr g = img.ptr<cv::Vec3b>(j)[i][1]; 
      uchar r = img.ptr<cv::Vec3b>(j)[i][2]; 

      std::cout << "b = " << (int) b << std::endl
                << "g = " << (int) g << std::endl
                << "r = " << (int) r << std::endl;

    
 

灰度格式

cv::Mat img;
cv::cvtColor(src,img,CV_BGR2RGB);

for(int j = 0; j < img.rows; j++) 
   for(int i = 0; i < img.cols; i++) 
      std::cout << "gray value = " << img.ptr<uchar>(j)[i] << std::endl;
   

【讨论】:

嗨 RyanLiu 实际上,当我用我的代码编写你的行时,我得到了如下错误:“指向绑定函数的指针只能用于调用函数”,你能看看它吗... @user2978527 版本错误抱歉,访问图片的来源“img.ptr<:vec3>[j](i)(0)”需要更改为新版本"img.ptr<:vec3>(j)[i][0]" 我已经修复了错误。更多信息***.com/a/21346778/2469488

以上是关于从位图图像文件中读取像素数据值的主要内容,如果未能解决你的问题,请参考以下文章

C++:读取位图图像的问题

C ++:读取位图图像的问题

VC++图像处理中对BItmap文件结构的读取

用c语言读取24位位图bmp文件

我想了解位图、像素等相关基础知识

用C或C++怎样提取出bmp图像的像素点信息值?用LSB算法做信息隐藏,位图是24位的。