我试图访问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;}
}
我检索到的所有强度均为零,直方图也为零。
答案 0 :(得分:2)
Math.sqrt(...)
是不正确的,就像C / C ++中的img*=(4095/65535);//Normalise back to get corect intensities
(将整数除以更大的整数)。
也许是(4095/65535)=0
吗?
答案 1 :(得分: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