在群里有人提了这么一个问题:
请教大家一个问题 ,在缩放的时候,不落在整数坐标系上的新像素点或省略的像素会发生什么? 新颜色值?
熟悉使用LabVIEW Vision的同学都知道,在Image显示图像控件上,鼠标移动时,在下面的信息栏中,是可以将当前鼠标位置下的坐标值及对应的图像灰度值(彩色RGB值)等信息显示出来的:
Image上显示了分辨率、倍率、图像类型、颜色值、坐标值等信息
在移动鼠标时,可以看到最后的(xxx,yyy)坐标值,都是整数的。这里也就是在image在显示图像时的坐标值,均取整数了。没有小数显示一说。
这个其实也是很好理解的。首先就是相机的像素点是一个点一个点排列的,图像通常都是输出U8、I16、U16这样的整型的图像,很少见到有输出浮点型数据的图像(有,不多见),所以原始图像通常都是整形的坐标系。因为像素点如果适应屏幕,其实也是一个点个点的。如果图像在Image控件中放大倍率刚好是1X,那么其实就是图像上一个像素点,代表了屏幕上的一个像素点:
1X时的效果
而当显示的倍率小于1X时,就如第一幅图时的0.5X,这个时候的图像显示,其实是使用抽样来显示的,0.5X时,刚好是2选1,所以这时的坐标则是0,2,4,6……这样的偶数。如果是0.33倍,那就是3选1;而当显示的倍率大于1倍时,则会使用屏幕上的多个像素点来表示图像上的一个点,例如说2*2,3*3,4*4这样子,2*2也就是宽方向2个像素高方向2个像素,共4个像素表示图像上的一个点:
屏幕上多个点来表示图像上一个像素点
上面的,就是图像直接显示的问题。下面再来看看计算结果的问题。
在NI Vision中,有很多计算结果会输出坐标值,例如说找点函数、找直边函数,找圆函数,其输出的结果,都是DBL/SGL类型的浮点形数据,带小数点的:
找圆边输出的圆心是SGL的数据类型
那么,这些小数类型的坐标,要显示到图像上,该如何处理?
要想将结果显示到图像上,通常都是通过覆盖函数来实现的,例如上面的圆心要想显示出来,那么可以通过覆盖点函数来实现:
覆盖点
从覆盖点函数中可以看到Point输入点,要求的是I32整数类型的数据。也就是这里的显示,也是显示整数,而不会显示小数。圆心的小数数据显示到图像上,将强制转换为整形。这时如果放大看图像,可能会存在些许差异,数据被四舍五入了。
其实,这个问题,在ROI中也是如此的,ROI也是整数类型的,不会使用小数点:
整数类型的ROI
综合归纳一下,直接操作图像坐标的,基本都是整数类型的。而通过函数计算得到的结果数据,则通常是小数类型的。