OpenCV2.1,地图功能?访问每个像素?

Posted

技术标签:

【中文标题】OpenCV2.1,地图功能?访问每个像素?【英文标题】:OpenCV2.1, map function? accessing each pixel? 【发布时间】:2010-09-06 01:22:30 【问题描述】:

我想将一个函数应用于 YUN 图像中的每个像素(称为 src)。我希望将输出保存到单独的图像中,称之为(dst)。

我知道我可以通过指针算法和访问图像的底层矩阵来实现这一点。我想知道是否有更简单的方法,比如预定义的“映射”函数,它允许我将函数映射到所有像素?

谢谢,

【问题讨论】:

【参考方案1】:

由于我不知道 YUN 图像是什么,我假设您知道如何将 RGB 转换为该格式。

我不知道执行您提到的 map 功能的简单方法。无论如何,OpenCV 有一些预定义的函数来进行图像转换,包括

cvCvtColor(color_frame, gray_frame, CV_BGR2GRAY);

你可能想仔细看看。

如果你想自己做,你需要单独访问图像的每个像素,这段代码向你展示了如何做(为了简单起见,下面的代码跳过了各种错误并返回检查):

// Loading src image 
IplImage* src_img = cvLoadImage("input.png", CV_LOAD_IMAGE_UNCHANGED); 
int width = src_img->width; 
int height = src_img->height;
int bpp = src_img->nChannels; 

// Temporary buffer to save the modified image
char* buff = new char[width * height * bpp];

// Loop to iterate over each pixel of the original img
for (int i=0; i < width*height*bpp; i+=bpp) 

  /* Perform pixel operation inside this loop */

  if (!(i % (width*bpp))) // printing empty line for better readability
      std::cout << std::endl;

   std::cout << std::dec << "R:" << (int) src_img->imageData[i] <<  
                            " G:" << (int) src_img->imageData[i+1] <<  
                            " B:" << (int) src_img->imageData[i+2] << " "; 

  /* Let's say you wanted to do a lazy grayscale conversion */
  char gray = (src_img->imageData[i] + src_img->imageData[i+1] + src_img->imageData[i+2]) / 3;
  buff[i] = gray;
  buff[i+1] = gray;
  buff[i+2] = gray;


IplImage* dst_img = cvCreateImage(cvSize(width, height), src_img->depth, bpp);  
dst_img->imageData = buff;

if (!cvSaveImage("output.png", dst_img))

  std::cout << "ERROR: Failed cvSaveImage" << std::endl;

基本上,代码从硬盘加载一张 RGB 图像,并对图像的每个像素进行灰度转换,将其保存到临时缓冲区。稍后,它将使用灰度数据创建另一个 IplImage,然后将其保存到磁盘上的文件中。

【讨论】:

以上是关于OpenCV2.1,地图功能?访问每个像素?的主要内容,如果未能解决你的问题,请参考以下文章

《OpenCV:访问Mat图像中每个像素值》

QT软件开发: 访问QImage每个像素点填充指定颜色

OpenCV - 无法访问 Mat 中的所有像素

将矢量轮廓区域(边界)转换为光栅图(像素网格)

从谷歌静态地图中的像素坐标获取经度/纬度

如何在 C++ 中绘制纹理/位图的区域?