【DigiKey“智造万物,快乐不停”创意大赛】一、灰度识别及其原理
[复制链接]
本帖最后由 Zhao_kar 于 2023-11-18 23:57 编辑
【DigiKey“智造万物,快乐不停”创意大赛】
一、灰度识别及其原理
闲聊:本次参加digikey的这个创意大赛,目前打算是使用openmv去做一个光线传感的项目,近期由于fpga的比赛,迟迟没有更新,实际开始学习是11.12后,我也是第一次学习相关的内容,目前关于光线传感的项目,仍有一系列的问题。
1、由于openmv实际上,简单说只是一个摄像头,使用图像处理的算法去获得光线的值,目前我除了灰度值我还没想到什么其他更加有效的方法,我暂时不知道这个摄像头能接受到的数据能有什么是跟光照度有很大关系的。
2、但是灰度值的效果我感觉不会很好,一个0-255的区间,对于后续的反馈模块,我觉得这个区间不太能够明显的展示当前的光照度,虽然使用灰度值去反馈当前摄像头的拍摄范围内的光照度也不是不行,毕竟图像中每个像素都有灰度值,这些值可以反映光线强度的信息。
3、如果就用这个灰度值作为判定光照度的指标,那为什么不画一个光线传感器模块,或者一个光敏电阻,然后直接把openmv当成一个单片机去进行一个通信操作呢,但是这样的话,随便拿一个单片机都能搞,说了这么多,也就是实用性的问题对我目前的进程有一些影响。
虽然有一些问题,但是我的项目备选还有其他方案,所以暂时不用管那么多,先好好考虑第一个光线传感的功能,所以本次报告还是把我学习到的灰度值的原理和在openmv上测试的过程记录下来。
一、灰度值的概念
1、灰度图像是一个图像中,每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像又不同,在计算机图像领域中黑白图像只有黑白两种颜色,灰度图像在黑色与白色之间还有许多级的颜色深度。简单来说,可以理解为一个像素点,灰度值是一个参数,其范围在0-255,白色是255,黑色是0,至于为什么是0-255,是因为其为8位的灰度图像。
2、灰度和彩色之间的关系
如果对于一张本身就是灰度图像(8位灰度图像)来说,他的像素值就是它的灰度值,如果是一张彩色图像,则它的灰度值需要经过函数映射来得到。灰度图像是由纯黑和纯白来过渡得到的,在黑色中加入白色就得到灰色,纯黑和纯白按不同的比例来混合就得到不同的灰度值。R=G=B=255为白色,R=G=B=0为黑色,R=G=B=小于255的某个整数时,此时就为某个灰度值。简单说,就是他们之间的可以算法转换的
二、代码部分
代码主要展示三个部分,第一个部分是灰度图像显示和算法一,第二部分是基于一的官方库改动,第三个是一个随便想到的简单的自适应功能(只是测试,并不能正常使用)
- 灰度显示+灰度值获取(注:此代码最终因为遍历,帧率可能只有2,不符合预期,所以使用官方的函数)
#导入
import sensor
import image
import time
# 初始化
sensor.reset() # 初始化感光
sensor.set_pixformat(sensor.GRAYSCALE)#设置像素模式,这里作为测试,用的是灰度
sensor.set_framesize(sensor.QVGA)# 图像大小,320——240
sensor.skip_frames(time=2000)# 跳过一些帧
clock = time.clock() # 帧率
# 获取图像
img = sensor.snapshot()
# 获取图像尺寸,其实已经知道了,但是作为代码,改动前面的QVGA成别的值的时候,就不用自己去改了
width = img.width()
height = img.height()
while True:
clock.tick()
img = sensor.snapshot()
# 初始化变量用于存储灰度值总和
total_gray = 0
# 遍历所有像素
for y in range(height):
for x in range(width):
# 获取像素灰度值
pixel_value = img.get_pixel(x, y)
# 累加灰度值
total_gray += pixel_value
# 计算平均灰度值
average_gray = total_gray / (width * height)
print("Average Gray Value:", average_gray)
#下面只是个随便的测试,是关于灰度获取的函数测试
gray = img.get_pixel(160, 120) #先对坐标160,120的获取灰度值
img.set_pixel(160,120,1) #获取完初始灰度值后,再设置灰度值
gray2 = img.get_pixel(160, 120) #此时使用第二个变量获得灰度值,再进行打印
#经过这种方法的两次打印,就可以测试函数的功能了
print(gray)
print(gray2)
print(clock.fps()) #显示帧率
#注:此代码最终因为遍历,帧率可能只有2,不符合预期,所以使用官方的函数
- 灰度显示+灰度值获取(官方库)
import sensor
import image
import time
# 初始化感光
sensor.reset()
sensor.set_pixformat(sensor.GRAYSCALE)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
clock = time.clock()
while True:
clock.tick()
img = sensor.snapshot()
# 获取图像统计信息
stats = img.get_statistics()
# 获取平均灰度值
average_gray = stats.mean()
#可以看到,此时不用遍历方法,使用官方的函数仍能得到想要的值,同时帧率也很高
print("Average Gray Value:", average_gray)
print(clock.fps()) #显示帧率
- 灰度显示+灰度值获取+自适应参数
import sensor
import image
import time
# 初始化感光
sensor.reset()
sensor.set_pixformat(sensor.GRAYSCALE)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
clock = time.clock()
# 初始亮度调整变量
brightness_adjustment = 0
while True:
clock.tick()
img = sensor.snapshot()
# 获取平均灰度值
average_gray = img.get_statistics().mean()
# 进行亮度调整
if average_gray > 150:
brightness_adjustment -= 10
elif average_gray < 100:
brightness_adjustment += 10
# 在这里,你可以使用brightness_adjustment来调整灰度值,确保在0-255的范围内
adjusted_gray = max(0, min(255, average_gray + brightness_adjustment))
print("Average Gray Value:", average_gray)
print("Adjusted Gray Value:", adjusted_gray)
print("Brightness Adjustment:", brightness_adjustment)
三、结果演示
- 可以看到,会显示平均灰度值,而且测试函数的像素点的两个灰度值也有,还有一个帧率,因为遍历原因,只有2帧率
- 可以看到,会显示平均灰度值,但是明显的变化是帧率,从2帧到了39
- 然后是随便写的一个自适应,其实就是大于某个值和小于某个值,然后给出一个反馈参数而已
四、最后放个视频演示吧,本次暂不展示过多内容,后续会持续更新报告进度。
ps:第三部分,忘记把清零放在while开头了,所以视频最后叠加了
|