【正点原子K210连载】第三十四章 image图像滤波实验 摘自【正点原子】DNK210使用指南-CanMV版指南

本文主要是介绍【正点原子K210连载】第三十四章 image图像滤波实验 摘自【正点原子】DNK210使用指南-CanMV版指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第三十四章 image图像滤波实验

在上一章节中,介绍了image模块中元素绘制方法给的使用,本章将继续介绍image模块中图像滤波方法的使用。通过本章的学习,读者将学习到image模块中图像滤波的使用。
本章分为如下几个小节:
34.1 image模块图像滤波方法介绍
34.2 硬件设计
34.3 程序设计
34.4 运行验证

34.1 image模块图像滤波方法介绍
image模块为Image对象提供了histeq()方法,用于对图像进行直方图均衡处理,histeq()方法如下所示:
image.histeq(adaptive=False, clip_limit=-1)
histeq()方法用于对图像进行直方图均衡处理,直方图均衡处理能够使得图像中的对比度和亮度标准化。
adaptive指的是是否使用自适应直方图均衡算法,自适应直方图均衡算法通常比非自适应直方图均衡算法效果更好,但需要更长的运行时间,当为False时,使用非自适应直方图均衡算法,当为True时,使用自适应直方图均衡算法,默认为False。
clip_limit指的是自适应均衡对比度,默认为-1。
histeq()方法会返回经过处理的Image对象。
histeq()方法的使用示例如下所示:
import image

img = image.Image(size=(320, 240))
img.histeq(adaptive=True, clip_limit=3)
image模块为Image对象提供了gaussian()方法,用于对图像进行模糊滤波处理,gaussian()方法如下所示:
image.gaussian(size, unsharp=False, mul, add=0, threshold=False, offset=0, invert=False, mask)
gaussian()方法用于对图像进行模糊滤波处理,具体的实现方式是使用平滑高斯核对图像进行卷积。
size指的是卷积核的大小,可为1(33)、2(55)或更高值。
unsharp指的是执行非锐化掩膜操作,从而提高边缘的图像清晰度。
mul指的是用以与卷积结果相乘的数字,若不设置,则使用默认的自动值,该值将放置卷积输出中的缩放,可以进行全局对比度调整。
add指的是用来与每个像素卷积结果相加的数值,可以进行全局亮度调整。
threshold指的是是否开启图像的自适应阈值处理,开启后可以根据环境像素的亮度,将像素设置为1或者0。
offset指的是开启图像的自适应阈值处理后,如何将像素设置为1,若为负数,则会将更多的像素设置为1,若为正数,则仅将最强对比度的像素设置为1。
invert指的是是否反转二进制图像的输出结果。
mask指的是另一个用作绘图操作的像素级掩码的图像,掩码应该是一个只有黑色和白色像素的图像,并且因该与所处理的Image对象具有相同的大小,仅有掩码中设置的像素会被修改。
gaussian()方法会返回经过处理的Image对象。
gaussian()方法的使用示例如下所示:

import imageimg = image.Image(size=(320, 240))
img.gaussian(2)

image模块为Image对象提供了cartoon()方法,用于对图像进行卡通滤波处理,cartoon()方法如下所示:
image.cartoon(seed_threshold=0.05, floating_threshold=0.05, mask)
cartoon()方法用于对图像进行卡通滤波处理,对图像进行卡通滤波后,还会使用flood-fills算法填充图像中的所有像素区域,通过使图像的所有区域颜色变平来有效地从图像中去除纹理,为了获得最佳效果,图像应具有大量对比度,以使区域不会太容易相互渗透。
seed_threshold指的是填充区域中的像素与原始起始像素的差异。
floating_threshold指的是填充区域中的像素与任何相邻像素的差异。
mask指的是另一个用作绘图操作的像素级掩码的图像,掩码应该是一个只有黑色和白色像素的图像,并且因该与所处理的Image对象具有相同的大小,仅有掩码中设置的像素会被修改。
cartoon()方法会返回经过处理的Image对象。
cartoon()方法的使用示例如下所示:

import imageimg = image.Image(size=(320, 240))
img.cartoon(seed_threshold=0.2, floating_threshold=0.05)

image模块为Image对象提供了binary()方法,用于对图像进行二值滤波处理,binary()方法如下所示:
image.binary(thresholds, invert=False, zero=False, mask)
binary()方法用于对图像进行二值滤波处理,二值滤波处理后的图像中的所有像素会被设置为黑色或白色。
thresholds指的是阈值列表,方法会根据像素值是否在阈值列表中的阈值内,来决定将像素这是为黑色或者白色。
invert指的是是否对阈值进行反转操作。
zero指的是将阈值像素清零,并使不在阈值列表中的像素保持不变。
mask指的是另一个用作绘图操作的像素级掩码的图像,掩码应该是一个只有黑色和白色像素的图像,并且因该与所处理的Image对象具有相同的大小,仅有掩码中设置的像素会被修改。
binary()方法会返回经过处理的Image对象。
binary()方法的使用示例如下所示:

import imageimg = image.Image(size=(320, 240))
img.binary([(25, 94, -12, 32, -71, -12)], invert=True, zero=True)

image模块为Image对象提供了laplacian()方法,用于对图像进行边缘滤波处理,laplacian()方法如下所示:
image.laplacian(size, sharpen=False, mul, add=0, threshold=False, offset=0, invert=False, mask)
laplacian()方法用于对图像进行边缘滤波处理,具体的实现方式是使用拉普拉斯核对图像进行卷积。
size指的是卷积核的大小,可为1(33)、2(55)或更高值。
sharpen指的是是否改为锐化想,而不是仅输出未经过阈值处理的边缘检测图像,增加卷积核大小然后增加图像清晰度。
mul指的是用以与卷积结果相乘的数字,若不设置,则使用默认的自动值,该值将放置卷积输出中的缩放,可以进行全局对比度调整。
add指的是用来与每个像素卷积结果相加的数值,可以进行全局亮度调整。
threshold指的是是否开启图像的自适应阈值处理,开启后可以根据环境像素的亮度,将像素设置为1或者0。
offset指的是开启图像的自适应阈值处理后,如何将像素设置为1,若为负数,则会将更多的像素设置为1,若为正数,则仅将最强对比度的像素设置为1。
invert指的是是否反转二进制图像的输出结果。
mask指的是另一个用作绘图操作的像素级掩码的图像,掩码应该是一个只有黑色和白色像素的图像,并且因该与所处理的Image对象具有相同的大小,仅有掩码中设置的像素会被修改。
laplacian()方法会返回经过处理的Image对象。
laplacian()方法的使用示例如下所示:

import imageimg = image.Image(size=(320, 240))
img.laplacian(1)

image模块为Image对象提供了morph()方法,用于对图像进行卷积处理,morph()方法如下所示:
image.morph(size, kernel, mul, add=1, threshold=False, offset=0, invert=False, mask)
morph()方法用于对图像进行卷积处理,需要提供卷积操作使用的卷积核。
size指的是卷积核的大小,可为1(33)、2(55)或更高值。
mul指的是用以与卷积结果相乘的数字,若不设置,则使用默认的自动值,该值将放置卷积输出中的缩放,可以进行全局对比度调整。
add指的是用来与每个像素卷积结果相加的数值,可以进行全局亮度调整。
threshold指的是是否开启图像的自适应阈值处理,开启后可以根据环境像素的亮度,将像素设置为1或者0。
offset指的是开启图像的自适应阈值处理后,如何将像素设置为1,若为负数,则会将更多的像素设置为1,若为正数,则仅将最强对比度的像素设置为1。
invert指的是是否反转二进制图像的输出结果。
mask指的是另一个用作绘图操作的像素级掩码的图像,掩码应该是一个只有黑色和白色像素的图像,并且因该与所处理的Image对象具有相同的大小,仅有掩码中设置的像素会被修改。
morph()方法会返回经过处理的Image对象。
morph()方法的使用示例如下所示:

import imagekernrl = [-1,  0,  1,-2,  0,  2,-1,  0,  1
]
img = image.Image(size=(320, 240))
img.morph(1, kernrl)

image模块为Image对象提供了negate()方法,用于对图像进行像素翻转处理,negate()方法如下所示:
image.negate()
negate()方法用于对图像进行像素翻转处理,处理的速度非常快速,且能够对每个颜色通道的像素值进行数值转换。
negate()方法会返回经过处理的Image对象。
negate()方法的使用示例如下所示:

import imageimg = image.Image(size=(320, 240))
img.negate()

image模块为Image对象提供了rotation_corr()方法,用于对图像进行透视矫正处理,rotation_corr()方法如下所示:
image.rotation_corr(x_rotation=0, y_rotation=0, z_rotation=0, x_translation=0, y_translation=0, zoom=1, fov=60, corners)
roataion_corr()方法用于对图像进行透视矫正处理,通过对图像进行三维旋转来纠正图像中的透视问题。
x_rotation、y_rotation和z_rotation指的是图像绕X、Y和Z轴旋转的角度度数,即分别对应上下旋转、左右旋转和平面旋转。
x_translation和y_translation指的是图像旋转后沿X或Y转平移的单位数,因为转换应用于三维空间,因此单位并不是像素。
zoom指的是图像缩放的倍数,默认为1。
fov指的是在进行二维到三维投影时,在三维空间旋转图像之前内部使用的视场,当这个值接近0时,图像将被放置在距离视口无限远的地方,当这个值接近180时,图像将被放置在视口中,通常,不应该改变这个参数的默认值,但可以通过修改它来改变二维到三维的映射效果。
corners指的是一个拥有四个(x, y)tuples的list,代表四个corner用来创建四点对应单应性,将第一个corner映射到(0, 0),第二个corner(image_width-1, 0),第三个corner(image_width-1, image_height-1)和第四个corner(0, image_height-1),然后在图像被重新映射后应用三维旋转旋转,这个参数允许使用rotation_corr()方法来做一些事情,比如鸟瞰图转换。
rotation_corr()方法会返回经过处理的Image对象。
rotation_corr()方法的使用示例如下所示:

import imageimg = image.Image(size=(320, 240))
target_point = [(-50, -50),(img.width()-1, 0),(img.width()-1+50, img.height()-1+50),(0, img.height()-1)
]
img.rotation_corr(corners=target_point)

image模块为Image对象提供了replace()方法,用于对图像进行镜像和翻转处理,replace()方法如下所示:
image.replace(hmirror=False, vflip=False, mask)
replace()方法用于对图像进行镜像和翻转处理。
hmirror指的是是否对图像进行水平镜像处理。
vflip指的是是否对图像进行垂直翻转处理。
mask指的是另一个用作绘图操作的像素级掩码的图像,掩码应该是一个只有黑色和白色像素的图像,并且因该与所处理的Image对象具有相同的大小,仅有掩码中设置的像素会被修改。
replace()方法会返回经过处理的Image对象。
replace()方法的使用示例如下所示:

import imageimg = image.Image(size=(320, 240))
img.replace(hmirror=True)

34.2 硬件设计
34.2.1 例程功能

  1. 获取摄像头输出的图像,并使用image模块对图像进行一些处理后,将图像显示在LCD上。
  2. 当KEY0按键被按下后,切换image模块对图像的处理方式。
    34.2.2 硬件资源
    本章实验内容,主要讲解image模块的使用,无需关注硬件资源。
    34.2.3 原理图
    本章实验内容,主要讲解image模块的使用,无需关注原理图。
    34.3 程序设计
    34.3.1 image模块图像滤波方法介绍
    有关image模块图像滤波方法的介绍,请见第34.1小节《image模块图像滤波方法介绍》。
    34.3.2 程序流程图
    在这里插入图片描述

图34.3.2.1 image图像滤波实验流程图
34.3.3 main.py代码
main.py中的脚本代码如下所示:

from board import board_info
from fpioa_manager import fm
from maix import GPIO
import time
import lcd
import sensor
import gclcd.init()
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)type = 0
type_dict = {0: "Normal",1: "Adaptive Histogram Equalization",2: "Blur",3: "Cartoon",4: "Binary",5: "Edge",6: "Kernel",7: "Negative",8: "Perspective Correction",9: "Mirror & Flip"
}fm.register(board_info.KEY0, fm.fpioa.GPIOHS0)
key0 = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_UP)def key_irq_handler(key):global key0global typetime.sleep_ms(20)if key is key0 and key.value() == 0:type = type + 1if type == len(type_dict):type = 0
key0.irq(key_irq_handler, GPIO.IRQ_FALLING, GPIO.WAKEUP_NOT_SUPPORT, 7)while True:img = sensor.snapshot()if type == 0:# 原图passelif type == 1:# 直方图均衡img.histeq(adaptive=True, clip_limit=3)elif type == 2:# 模糊滤波img.gaussian(2)elif type == 3:# 卡通滤波img.cartoon(seed_threshold=0.2, floating_thresholds=0.05)elif type == 4:# 二值滤波img.binary([(25, 94, -12, 32, -71, -12)], invert=True, zero=True)elif type == 5:# 边缘滤波img.laplacian(1)elif type == 6:kernrl = [-1,  0,  1,-2,  0,  2,-1,  0,  1]# 图像卷积img.morph(1, kernrl)elif type == 7:# 像素翻转img.negate()elif type == 8:target_point = [(-50, -50),(img.width()-1, 0),(img.width()-1+50, img.height()-1+50),(0, img.height()-1)]# 透视矫正img.rotation_corr(corners=target_point)elif type == 9:# 镜像和翻转img.replace(hmirror=True, vflip=True)else:type = 0img.draw_string(10, 10, type_dict[type], color=(255, 0, 0), scale=1.6)lcd.display(img)gc.collect()

可以看到一开始是先初始化了LCD、摄像头和中断按键,并且按下中断按键可以切换图像处理的方式。
接着在一个循环中不断地获取摄像头输出的图像,因为获取到的图像就是Image对象,因此可以直接调用image模块为Image对象提供的各种方法,然后就是对图像进行处理,最后在LCD显示处理好后的图像。
34.4 运行验证
将DNK210开发板连接CanMV IDE,点击CanMV IDE上的“开始(运行脚本)”按钮后,便能看到LCD上显示了处理后的摄像头图像,按下KEY0按键还能够切换处理方式,如下图所示:
在这里插入图片描述

图34.4.1 摄像头原图图像
在这里插入图片描述

图34.4.2 直方图均衡处理后图像
在这里插入图片描述

图34.4.3 模糊滤波处理后图像
在这里插入图片描述

图34.4.4 卡通滤波处理后图像
在这里插入图片描述

图34.4.5 二值滤波处理后图像
在这里插入图片描述

图34.4.6 边缘滤波处理后图像
在这里插入图片描述

图34.4.7 图像卷积处理后图像
在这里插入图片描述

图34.4.8 像素翻转处理后图像
在这里插入图片描述

图34.4.9 透视矫正处理后图像
在这里插入图片描述

图34.4.10 镜像和翻转处理后图像

这篇关于【正点原子K210连载】第三十四章 image图像滤波实验 摘自【正点原子】DNK210使用指南-CanMV版指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1133204

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

Open3D 基于法线的双边滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 输入参数: 输出参数: 参数影响: 2.2完整代码 三、实现效果 3.1原始点云 3.2滤波后点云 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述         基于法线的双边

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

6.4双边滤波

目录 实验原理 示例代码1 运行结果1 实验代码2 运行结果2 实验原理 双边滤波(Bilateral Filtering)是一种非线性滤波技术,用于图像处理中去除噪声,同时保留边缘和细节。这种滤波器结合了空间邻近性和像素值相似性的双重加权,从而能够在去噪(平滑图像)的同时保留图像的边缘细节。双边滤波器能够在的同时,保持边缘清晰,因此非常适合用于去除噪声和保持图像特征。在Op

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因