无法使用cimg访问图像中的像素强度(返回0)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法使用cimg访问图像中的像素强度(返回0)相关的知识,希望对你有一定的参考价值。

我试图访问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;

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

答案

如果你只想在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
另一答案

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

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

以上是关于无法使用cimg访问图像中的像素强度(返回0)的主要内容,如果未能解决你的问题,请参考以下文章

使用CImg将图像文件转换为像素矢量?

在openCV中访问某些像素的强度值(灰度图像)

使用 CImg 编辑 RGB 像素数据 - Visual C++ 2008

如何从 kinect 深度图像中获取深度强度,因为它表示像素到传感器的距离

matlab画图像的像素强度分布

CImg 无法识别文件“bmp”的格式