【问题标题】:can't access pixel intensities in image using cimg (returns 0)无法使用 cimg 访问图像中的像素强度(返回 0)
【发布时间】:2019-04-10 09:26:03
【问题描述】:

我正在尝试访问 Cimg 像素值以打印出我的鼠标所在的像素强度,以及计算直方图。但是,我从 Cimg 对象中得到了全零。

cimg 图像是从内存缓冲区启动的,它是 12 位灰度图像,但填充到 16 位以保存在内存中。 下面的代码是在一个被多次调用的函数中定义的。我想刷新当前显示中的图像,而不是每次调用该函数时都生成一个新图像。所以 Cimgdisp 是在函数外定义的。

#include "include\CImg.h"
int main(){
    CImg <unsigned short> image(width,height,1,1);
    CImgDisplay           disp(image);
//showImg() get called multiple times here

}

void showImg(){
    unsigned short* imgPtr = (unsigned short*) (getImagePtr());
    CImg <unsigned short> img(imgPtr,width,height);

    img*=(65535/4095);//Renormalise from 12 bit input to 16bit for better display

    //Display 
    disp->render(img);
    disp->paint();
    img*=(4095/65535);//Normalise back to get corect intensities

    CImg <float> hist(img.histogram(100));
    hist.display_graph(0,3);

    //find mouse position and disp intensity
    mouseX = disp->mouse_x()*width/disp->width();//Rescale the position of the mouse to true position of the image
    mouseY = disp->mouse_y()*height/disp->height();
    if (mouseX>0&mouseY>0){
        PxIntensity = img(mouseX,mouseY,0,0);}
    else {
        PxIntensity = -1;}
}

我检索到的所有强度都为零,直方图也为零。

【问题讨论】:

  • 您似乎没有加载图像。另外,请根据 Stack Overflow 规则确保您的代码最低限度的完整和可验证。这意味着#include 语句应该在那里,并且任何无关的东西,比如设置标题不应该在那里。

标签: c++ cimg


【解决方案1】:

img*=(4095/65535);//Normalise back to get corect intensities 不正确,如 C/C++ 中的 (4095/65535)=0(整数除以更大的整数)。

也许img*=(4095/65535.);

【讨论】:

    【解决方案2】:

    如果您只想在 12 位和 16 位之间进行缩放,那么只使用位移可能会更好。

    img<<=4;//Renormalise from 12 bit input to 16bit for better display
    
    //Display 
    disp->render(img);
    disp->paint();
    img>>=4;//Normalise back to get corect intensities
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      相关资源
      最近更新 更多