目录
前言:
本人所用为01 studio的pyAi-K210和pyAI-OpenMV4,本人在学习完K210后,学习openMV时发现很多实验K210和openMV可以一起学习,所以写下此篇分享,本人基本都是个人笔记,非常希望有大佬提出错误和改进之处,但大佬轻喷哈!!!
----------------------------------------------------------我是分割线--------------------------------------------------------
前面我们学习了,'03.特征检测' 但是会发现在检测过程中图形会有千奇百怪的问题出现,于是就会想对拍摄到的图像进行提取,而接下来我们将学习,对图像的锐化,二值化等等。
一、颜色二值化滤波:
图形的二值化滤波是指将灰度图像转化为二值图像(只有黑和白两个灰度)的图像处理技术。
设置一个门限值,大于该值的灰度像素变为白色,小于该值的灰度像素变为黑色。常用的二值化方法有固定阈值法、自适应阈值法等。
构造函数 | image.binary(thresholds,invert=False[,zerp=Falese[,mask=None[,to_bitmap=False[,copy=False]]]]]) 【thresholds】必须是元组列表。 (lo, hi) 定义你想追踪的颜色范围。对于灰 度图像,每个元组需要包含两个值:最小灰度值和最大灰度值。 【invert】如果为 True,则 0 1(黑 白)反转;默认 False 不反转。 【zero】是否将阈值之间的像素变为0(黑色)。默认False,阈值之间为原始数据。 【mask】掩码图像,只对掩码内非零位置的像素进行阈值化。默认None表示处理整幅图像。 【to_bitmap】是否转换为位图格式,默认False 【copy】是否复制图像而不是在原图上操作。默认False,即直接在输入图像上修改。 |
使用方法 | 直接调用该函数。 |
官方例程如下:
'''
导入 sensor 等相关模块
初始化和配置 sensor 模块
实时拍摄采集图像
二值化滤波处理
'''
import sensor, image, time
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.skip_frames(time = 2000)
clock = time.clock()
# 可以使用 工具-> 机器视觉 -> 阈值编辑器 来调整阈值.
red_threshold = (0,100, 0,127, 0,127) # L A B
green_threshold = (0,100, -128,0, 0,127) # L A B
blue_threshold = (0,100, -128,127, -128,0) # L A B
while(True):
# Test red threshold
for i in range(100):
clock.tick()
img = sensor.snapshot()
img.binary([red_threshold])
print(clock.fps())
'''
# Test green threshold
for i in range(100):
clock.tick()
img = sensor.snapshot()
img.binary([green_threshold])
print(clock.fps())
# Test blue threshold
for i in range(100):
clock.tick()
img = sensor.snapshot()
img.binary([blue_threshold])
print(clock.fps())
# Test not red threshold
for i in range(100):
clock.tick()
img = sensor.snapshot()
img.binary([red_threshold], invert = 1)
print(clock.fps())
# Test not green threshold
for i in range(100):
clock.tick()
img = sensor.snapshot()
img.binary([green_threshold], invert = 1)
print(clock.fps())
# Test not blue threshold
for i in range(100):
clock.tick()
img = sensor.snapshot()
img.binary([blue_threshold], invert = 1)
print(clock.fps())
'''
# todo 以上代码对 K210和OpenMV4 均适用
二、锐化滤波:
构造函数 | image.laplacian(size[,sharpen=False[,mul[,add=0[,threshold=False[,offset=0[,mask=None]]]]]]]) 【size】内核大小。1(3×3),2(5×5))或者更高值; 【sharpen】如果为Ture,则为锐化图形。 【mul】与原图混合时的乘数,默认为1 【add】与原图混合时的加数,默认为0。 【threshold】是否对拉普拉斯图像进行二值化,默认不进行。 【offset】二值化时阈值偏移量,与threshold一起使用。 【mask】掩码图像,只对掩码内非零位置进行滤波。默认None表示处理整幅图像。 |
使用方法 | 直接调用函数 |
官方代码如下:
'''
导入 sensor 等相关模块
初始化和配置 sensor 模块
实时拍摄采集图像
锐化滤波处理
'''
import sensor, image, time
#摄像头初始化
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.GRAYSCALE) # or sensor.RGB565
sensor.set_framesize(sensor.QQVGA) # or sensor.QVGA (or others)
sensor.skip_frames(time = 2000) # Let new settings take affect.
clock = time.clock() # Tracks FPS.
while(True):
clock.tick() # Track elapsed milliseconds between snapshots().
img = sensor.snapshot() # Take a picture and return the image.
# 运行拉普拉斯内核.
img.laplacian(1, sharpen=True)
print(clock.fps()) #打印 FPS
# todo 以上代码 OpenMV4和K210 均可使用
三、图像翻转:
构造函数 | image.replace(image[,hmirror=False[,vflip=False[,transpose=False[.mask=None]]]]) 【image】要操作的图形对象; 【hmirror】如果为Ture,则水平镜像转替换图形。 【vflip】如果为Ture,则垂直翻转替换图形。 【transpose】如果为 True,则沿对角线翻转图像。 |
使用方法 | 直接调用该函数。 例: vflip=False, hmirror=False, transpose=False -> 旋转 0° vflip=True, hmirror=False, transpose=True -> 旋转 90° vflip=True, hmirror=True, transpose=False -> 旋转 180° vflip=False, hmirror=True, transpose=True -> 旋转 270° |
官方代码如下:
'''
导入 sensor 等相关模块
初始化和配置 sensor 模块
实时拍摄采集图像
将图像进行各种翻转
'''
import sensor, image, time, pyb
#摄像头初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
mills = pyb.millis()
counter = 0
while(True):
clock.tick()
img = sensor.snapshot().replace(vflip=(counter//2)%2,
hmirror=(counter//4)%2,transpose=(counter//8)%2)
# 也可以手动修改参数观察图像变化情况。
#img = sensor.snapshot().replace(vflip=False,hmirror=False, transpose=False)
if (pyb.millis() > (mills + 1000)):
mills = pyb.millis()
counter += 1
print(clock.fps())
# todo 以上代码对 K210和OpenMV4 均适用