大美南京网站,企业网站建设最需要的是什么,闵行区教育学院,环艺毕业设计代做网站PotatoPie 4.0开发板教程目录#xff08;2024/04/21#xff09;
为什么要进行图像的二值化#xff1f;
当我们处理图像时#xff0c;常常需要将其转换为二值图像。这是因为在很多应用中#xff0c;我们只对图像中的某些特定部分感兴趣#xff0c;而不需要考虑所有像素的…PotatoPie 4.0开发板教程目录2024/04/21
为什么要进行图像的二值化
当我们处理图像时常常需要将其转换为二值图像。这是因为在很多应用中我们只对图像中的某些特定部分感兴趣而不需要考虑所有像素的颜色信息。下面我会详细解释为什么要进行图像的二值化 简化图像结构彩色图像包含大量的像素每个像素都有自己的颜色信息。这种复杂性使得图像处理变得复杂。将图像转换为二值图像可以大大简化图像结构使得后续的处理更加高效。 突出目标特征在很多应用中我们只对图像中的某些目标感兴趣而不关心其他部分。通过二值化我们可以将目标与背景分离突出目标的特征便于进一步的分析和处理。 去除噪声图像中常常包含各种噪声如摄像头传感器的噪声、环境光线的影响等。这些噪声会干扰图像的分析和处理。通过二值化我们可以将噪声过滤掉只保留目标信息提高图像的质量。 减少计算量在一些图像处理算法中需要对每个像素进行复杂的计算。如果图像的分辨率很高计算量会非常大。将图像转换为二值图像可以大大减少计算量提高算法的执行效率。 图像压缩二值图像只包含黑白两种颜色信息量较少。因此可以通过二值化来压缩图像减少存储空间和传输带宽。
总之图像二值化是图像处理中的一项基础技术它可以简化图像结构、突出目标特征、去除噪声、减少计算量以及实现图像压缩等多种目的。
图像二值化的常用算法
图像二值化是图像处理中的一项基础任务有许多不同的算法可以实现。以下是几种常用的图像二值化算法 全局阈值法Global Thresholding全局阈值法是最简单和最常用的二值化方法之一。它通过设定一个全局阈值将图像中的像素分为两类大于阈值的像素设为白色小于等于阈值的像素设为黑色。其中Otsu 方法是全局阈值法中的一种优化方法它能自动确定最佳的阈值使得类间方差最大化。 局部阈值法Local Thresholding局部阈值法考虑到图像中不同区域的灰度分布可能不同因此采用不同的阈值来进行二值化。常见的局部阈值法包括自适应阈值法和基于统计的方法如局部均值、局部中值等。 基于直方图的方法Histogram-based Methods这些方法利用图像的灰度直方图来确定阈值。常见的方法包括基于双峰分析、直方图形态学等。 基于梯度的方法Gradient-based Methods这些方法基于图像的梯度信息来确定阈值。常见的方法包括基于边缘检测算子的方法如Sobel、Prewitt等。 基于聚类的方法Clustering-based Methods这些方法将图像中的像素看作是一个样本集合利用聚类算法将像素分成两个类别然后根据类别信息进行二值化。常见的方法包括K均值聚类、自组织映射聚类等。
这些算法各有优缺点适用于不同的图像处理任务和场景。在实际应用中根据图像的特点和需求选择合适的二值化算法是非常重要的。我们本节实验主要采用Otsu 方法。
Otsu 方法是由日本学者大津展之Nobuyuki Otsu于1979年提出的图像二值化算法。这个方法旨在通过自适应地确定最佳阈值将图像分为背景和前景两个类别以最大化类间方差来实现图像的自动化处理。
在 Otsu 方法被提出之前常用的图像二值化方法主要是基于手动设定阈值的全局阈值法。然而手动选择阈值可能会因为主观性而不准确尤其是对于不同的图像和应用场景需要不断调整阈值才能得到满意的结果。Otsu 方法的提出填补了这一缺陷使得图像二值化可以更加自动化和准确。
Otsu 方法的核心思想是通过最大化类间方差来确定最佳的阈值。在图像中背景和前景之间的差异体现在它们的灰度分布上。通过寻找一个阈值使得背景和前景之间的类间方差最大化我们可以实现最佳的图像二值化。这种方法不仅能够自动地确定最佳阈值而且在很多情况下能够产生高质量的二值化结果。
Otsu 方法的提出极大地促进了图像处理领域的发展成为了图像二值化中的经典算法之一。它被广泛应用于数字图像处理、计算机视觉、图像分割等领域为图像分析和识别提供了重要的基础。
Otsu 算法的详细步骤 计算直方图首先计算图像的灰度直方图统计每个灰度级别的像素数量。 归一化直方图将直方图中每个灰度级别的像素数量除以图像的总像素数得到每个灰度级别的归一化频率。 计算累积分布函数计算归一化直方图的累积分布函数即累积概率密度函数。这可以通过累加每个灰度级别的归一化频率来实现。 初始化类间方差和最佳阈值初始化类间方差为 0并将最佳阈值设为 0。 遍历阈值对每个可能的阈值 t 进行遍历从 0 到最大灰度级别。 计算类间方差对于每个阈值 t计算两个类别的均值和方差然后根据这些统计量计算类间方差。类间方差可通过下式计算得到 选择最佳阈值选择使类间方差最大的阈值作为最佳阈值即找到能够最好地将图像分成两个类别使得类别之间的差异最大化。 应用阈值使用最佳阈值将图像进行二值化处理将大于阈值的像素设为白色255小于等于阈值的像素设为黑色0。 通过这些步骤Otsu 算法能够自动确定最佳的阈值将图像转换为二值图像并且在很多情况下能够产生高质量的二值化结果。
用python实现Otsu 算法对图像进行二值化处理
PotatoPie 4.0 实验教程(21) —— FPGA实现摄像头图像二值化RGB2Gray2Bin-Anlogic-安路论坛-FPGA CPLD-ChipDebug 这个代码会读取名为 Lena.jpg 的彩色图片然后将其转换为灰度图像并使用 Otsu 算法进行图像二值化。然后显示原始彩色图像、灰度图像和二值化后的图像。
用如下的powershell指令运行python脚本后面的教程中将不再举例说明如何运行python文件。
可以看到演示效果
上面的代码是直接采用的opencv的otsu方法实现的没有展示细节我们下面提供的这段代码展示了otsu的方法细节。
matlab版代码
PotatoPie 4.0 实验教程(21) —— FPGA实现摄像头图像二值化RGB2Gray2Bin-Anlogic-安路论坛-FPGA CPLD-ChipDebug
这段 MATLAB 代码实现了以下功能
读取名为 “Lena.jpg” 的彩色图像。将彩色图像转换为灰度图像。使用 Otsu 算法对灰度图像进行二值化处理得到二值化图像。在单个窗口中显示原始彩色图像、灰度图像和二值化图像以便比较和分析图像处理的效果。
通过这段代码可以轻松地了解图像处理中常用的 Otsu 二值化算法并可视化其效果。
FPGA工程分析
工程层次图 与demo18相比只是多了一个img2rgb的模块也就是下面这一段代码在从SDRAM读出来之后经它处理后再输出hdmi_tx模块。
img_rgb2gray2bin u_img_rgb2gray2bin
(
.i_clk(clk_pixel),
.i_rst_n(sys_rst_n),
.i_hs(VGA_HS),
.i_vs(VGA_VS),
.i_de (VGA_DE),
.i_vld(1b1),
.i_th(78),
.i_r(VGA_RGB[23:16]),
.i_g(VGA_RGB[15:8] ),
.i_b(VGA_RGB[7:0] ),
.o_bin_hs(gray_hs),
.o_bin_vs(gray_vs),
.o_bin_de (gray_de),
.o_bin_data(gray_data)
);
模块代码分析
由于 Otsu 算法使用 Verilog 实现十分复杂这些步骤在EG4上实现资源不太够 这里我们将直接指定阈值进行二值化。
模块的管脚定义注释比较清晰如下 module img_rgb2gray2bin (
input wire i_clk, // 时钟信号
input wire i_rst_n, // 复位信号
input wire i_vld, // 有效信号
input wire [7:0] i_th, // 阈值信号
input wire i_hs, // 水平同步信号
input wire i_vs, // 垂直同步信号
input wire [7:0] i_r, // 红色通道信号
input wire [7:0] i_g, // 绿色通道信号
input wire [7:0] i_b, // 蓝色通道信号
input wire i_de, // 数据使能信号
output reg o_bin_hs, // 二值化水平同步信号
output reg o_bin_vs, // 二值化垂直同步信号
output reg o_bin_de, // 二值化数据使能信号
output reg [7:0] o_bin_data // 二值化图像数据信号
);
代码的流程比较简单先进行灰度转换
然后进行阈值比较
管脚约束
与PotatoPie 4.0 实验教程(18) —— FPGA实现OV5640摄像头采集以SDRAM作为显存进行HDMI输出显示相同不作赘述。
时序约束
与PotatoPie 4.0 实验教程(18) —— FPGA实现OV5640摄像头采集以SDRAM作为显存进行HDMI输出显示相同不作赘述。
实验结果
这是我的键盘和显示器这效果出来像水墨画啊下面是阈值98时候的效果。 说值调到45看看。 调到 78时效果我比较喜欢