我有一个函数,我想应用于YUN图像中的每个像素(称之为src)。我想将输出保存到单独的图像,调用它(dst)。
我知道我可以通过指针算法和访问图像的底层矩阵来实现这一点。我想知道是否有一种更简单的方法,比如一个预定义的“地图”功能,它允许我将一个函数映射到所有像素?
谢谢,
答案 0 :(得分:0)
由于我不知道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 ,然后将其保存到磁盘上的文件中。