如何测试图像中的像素是否在CImg中具有某种颜色?

时间:2017-07-17 21:54:56

标签: c++ image-processing cimg

我正在用CImg编写一个程序,我想测试图像中的像素是否为颜色#00FF00。我该怎么做?

2 个答案:

答案 0 :(得分:2)

要测试c列的像素,行r为绿色:

if((img(c,r,0,0)==0) &&
   (img(c,r,0,1)==255) &&
   (img(c,r,0,2)==0)) ...

这是一个5x1像素的图像,在一行中可以测试红色,绿色,蓝色,白色和黑色像素。将其另存为image.ppm

P3
5 1
255
255 0 0 0 255 0 0 0 255 255 255 255 0 0 0

扩大外观:

enter image description here

以下是一个完整的例子:

////////////////////////////////////////////////////////////////////////////////
// main.cpp
//
// CImg example of accessing pixels
//
// Build with: g++-6 -std=c++11  main.cpp -o main
// or:         clang++ main.cpp -o main
////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <cstdlib>

#define cimg_display 0
#include "CImg.h"

using namespace cimg_library;
using namespace std;

int main() {
    // Load image
    CImg<unsigned char> img("image.ppm");

    // Get width, height, number of channels
    int w=img.width();
    int h=img.height();
    int n=img.spectrum();
    cout << "Dimensions: " << w << "x" << h << " " << n << " channels" <<endl;

    // Dump all pixels
    for(int r=0;r<h;r++){
       for(int c=0;c<w;c++){
          char hex[16];
          sprintf(hex,"#%02x%02x%02x",img(c,r,0),img(c,r,1),img(c,r,2));
          cout << r << "," << c << " " << hex << endl;
          if((img(c,r,0,0)==0) &&
             (img(c,r,0,1)==255) &&
             (img(c,r,0,2)==0)){
             cout << "This pixel is green" << endl;
          }
       }
    }
}

示例输出

当使用上面的示例ppm文件运行时,程序会生成此代码:

Dimensions: 5x1 3 channels
0,0 #ff0000
0,1 #00ff00
This pixel is green
0,2 #0000ff
0,3 #ffffff
0,4 #000000

答案 1 :(得分:-1)

您可以致电COLORREF

获取CImage::GetPixel(int xPos, int yPos);

使用COLORREF,您可以创建新的COLORREF并比较两者:

CImage image;
COLORREF pixelColor = image.getPixel(451, 524); // this gets the color at (451,524) as a COLORREF
COLORREF greenColor = RGB(0, 255, 0);
if(pixelColor == greenColor)
{
    // THE COLORS ARE THE SAME!
}