根据API文档,image类部分方法允许使用标量输入:
**image.add(image[, mask=None])将两个图像按像素进行加法运算。
image:可以是图像对象、未压缩的图像文件路径(bmp/pgm/ppm),或标量值。标量值可以是 RGB888 元组或基础像素值(例如,灰度图像的 8 位灰度值)。
实际使用image类处理图像与标量输入的运算时,发现标量输入并不按照预期的处理得到结果
- 比如image是一个三个像素的灰度值(10,20,30),image.add(3)并不是每个像素加3,得到(13,23,33),而是保持不变.测试发现应该时标量值x的运算是image+int((x-8)/8.3),且运算过程会受到255截断即虽多加32。这个输入的标量值必须为int整数形式,浮点数不行
- 对两个图像运算是正常的
- 对其他乘除减法,融合等方法[.add() .sub() .div() .mul() .get_similarity .blend]测试都有类似的现象,.max .min .difference..replace, b_and还没测试,应该也是一样的
测试代码如下:
from media.media import *
from media.sensor import *
from media.display import *
WIDTH = 8
HEIGHT = 6
Display.init(Display.VIRT, to_ide = True, osd_num = 3, width=WIDTH, height=6)
MediaManager.init()
data = bytearray([i for i in range(WIDTH)])
print("data:", data)
img = image.Image(WIDTH, 1, image.GRAYSCALE, copy_to_fb=True, data=data)
print("像素值:", [img.get_pixel(x, 0) for x in range(WIDTH))
for i in range(0, 300, 1):
img = image.Image(WIDTH, 1, image.GRAYSCALE, copy_to_fb=True, data=data)
add_img = img.add(i)
print(i, "实际浮点值:", [add_img.get_pixel(x,0) for x in range(WIDTH)])
请问
- 怎样能实现正常的运算,这个方法处理标量的正确输入是怎样的?
- 实现输入为浮点数的运算,比如乘以1.2,后取整是否可能?
- 这个方法应该是在CPU大核里面计算的吧,相比于使用KPU的模型进行此类运算,哪种速度更快,哪种功耗更低?
软硬件版本信息
硬件型号:CanMV-K230-V1.1
固件文件:CanMV_K230_V1P0_P1_micropython_v1.3-0-g8dd764f_nncase_v2.9.0.img
CanMV IDE: 4.0.7-0