数字图像处理(12):灰度二值化

  • 灰度像素:在 RGB 颜色模型下,图像中每个像素颜色的 R、G、B 三种基色的分量值相等的像素。
  • 由灰度像素组成的灰度图像只能表现256中颜色(或亮度),通常把灰度图像中像素的亮度称为灰度值。
  • 灰度化处理:是指把彩色图像转化为灰色图像的处理过程,以下为经过灰度处理后的图像。(三原色亮度相同)

(1)灰度二值化处理

        图像处理的灰度二值化是图像处理中的一种重要技术,它可以将灰度图像转化为二值图像,以便于后续的处理分析;二值图像每个像素只有两个可能的值(通常是0和255)的图像,其中0表示黑色,255表示白色。因此二值图像呈现出明显的黑白效果。

(2)阈值和应用

        在灰度二值化过程中,需要选择一个阈值,将灰度像素中的像素值和阈值进行比较,如果像素值大于阈值,则该像素设置为白色,反之为黑色。

        灰度二值化在图像处理中由许多应用,例如:文字识别、条形码识别、图像分割,通过灰度二值化,可以将图像中的目标区域与背景区域分离开来,方便后续处理分析,同时,由于二值图像存储空间较小,因此可以减少图像处理过程中的计算量和存储成本。

(3)阈值的选取

  • 固定阈值:选择127(灰度值范围的一半)作为阈值T
  • 平均值阈值:将整张图片的灰度平均值作为二值化的阈值T
  • 双峰法:基于图像灰度直方图的二值化方法,在图像的灰度直方图中,如果物体的灰度分布比较有规律,背景和目标在图像直方图各自形成一个波峰,那么选择双峰之间的波谷灰度值作为阈值T(双峰法只适用于目标和背景的灰度值在直方图中形成两个明显的波峰的情况,如果直方图中的波峰不明显或者存在多个波峰,则双峰法可能无法取得理想的二值化效果)

(4)matlab代码实现

% 1. 读取图像
input_path = 'D:\FPGA\Image processing\4_gray_binary\img_matlab\1_1920x1080.bmp';
output_dir = 'D:\FPGA\Image processing\4_gray_binary\img_matlab\';
img_s = imread(input_path);% 获取图像尺寸
[height, width, ~] = size(img_s);% 创建一个新图像
grayimg = zeros(height, width, 3, 'uint8');% 灰度加权平均法
for i = 1:heightfor j = 1:widthgray = 0.30 * double(img_s(i, j, 1)) + 0.59 * ...double(img_s(i, j, 2)) + 0.11 * double(img_s(i, j, 3));grayimg(i, j, :) = uint8(gray);end
end% 转换为单通道灰度图
img = grayimg(:, :, 1);% 应用5种不同的阈值方法
th1 = imbinarize(img, 127/255); % 普通二值化
th2 = ~imbinarize(img, 127/255); % 反向二值化
th3 = img; % 截断二值化
th3(th3 > 127) = 127;
th4 = img; % 低阈值零处理
th4(th4 < 127) = 0;
th5 = img; % 高阈值零处理
th5(th5 >= 127) = 0;% 创建图像标题数组
titles = {'原始灰度图', '普通二值化', '反向二值化', '截断二值化', '低阈值零处理', '高阈值零处理'};
images = {img, th1, th2, th3, th4, th5};
filenames = {'1_原始灰度图.bmp', '2_普通二值化.bmp', '3_反向二值化.bmp', ...'4_截断二值化.bmp', '5_低阈值零处理.bmp', '6_高阈值零处理.bmp'};% 直接保存单张图片,不显示
for i = 1:6imwrite(images{i}, fullfile(output_dir, filenames{i}));
end% 创建并显示总览图
figure('Name', '图像二值化处理结果对比', 'NumberTitle', 'off', ...'Position', [100, 100, 1200, 800]);
for i = 1:6subplot(2, 3, i);imshow(images{i});axis image;title(titles{i}, 'FontSize', 12, 'FontName', '宋体');
end% 保存总览图但不关闭窗口
saveas(gcf, fullfile(output_dir, '总览图.bmp'));disp('所有图片已保存完成!总览图将保持显示。');

(5)测试普通二值化实验现象:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/62728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【已解决】git push需要输入用户名和密码问题

解决方法&#xff1a; 1&#xff09;查看使用的clone方式&#xff1a; git remote -v 2&#xff09;若为HTTPS&#xff0c;删除原clone方式: git remote rm origin 3&#xff09;添加新的clone方式&#xff1a; git remote add origin gitgithub.com:zludon/git_test.git …

Springfox迁移到 Springdoc OpenAPI 3

将项目从 Springfox 迁移到 Springdoc OpenAPI 3 时&#xff0c;主要的工作是将原先使用的 Springfox 注解替换为 Springdoc OpenAPI 3 中的对应注解。虽然 Springdoc OpenAPI 3 基于 OpenAPI 3 规范&#xff0c;并且有一些不同的命名方式和设计理念&#xff0c;但大部分注解的…

服务器处理HTTP

在服务器处理HTTP请求时&#xff0c;确实常常采用多线程或异步处理的模式来确保能够高效地处理多个客户端请求。以下是关于服务器如何处理请求的一些关键点&#xff1a; 多线程模型&#xff1a; 在多线程模型中&#xff0c;服务器会为每个新的客户端请求分配一个新的线程&#…

华为新手机和支付宝碰一下 带来更便捷支付体验

支付正在变的更简单。 11月26日&#xff0c;华为新品发布会引起众多关注。发布会上&#xff0c;华为常务董事余承东专门提到&#xff0c;华为Mate 70和Mate X6折叠屏手机的“独门支付秘技”——“碰一下”&#xff0c;并且表示经过华为和支付宝的共同优化&#xff0c;使用“碰…

Redis开发05:使用stackexchange.redis库对redis进行增删改查

一、安装第三方库 二、官网 StackExchange.Redis |通用型 redis 客户端 三、连接示例 private static string redisConnectionString "localhost:6379,passwordyourpassword,defaultDatabase0,allowAdmintrue,asyncTimeout10000";private static string redisConn…

Electron + vue3 打包之后不能跳转路由

路由不跳转问题原因&#xff1a; 是因为electron需要将vue-router的mode调整为hash模式(两种写法) export default new Router({mode: hash, //这里history修改为hashscrollBehavior: () > ({y: 0}),routes: constantRouterMap, }) export default new createRouter({his…

git push使用

推送指定分支 将当前分支推送远程 git push origin HEAD:<branch-name> 这里的 HEAD 是一个特殊的指针&#xff0c;它指向当前分支的最新提交。这条命令会将当前分支的更改推送到远程的 master 分支。 示例 git push origin HEAD:main 当前分支是test&#xff0c;远…

android-studio 下载并安装

在 Ubuntu 22.04 上安装和配置 Android Studio&#xff0c;按照以下步骤操作&#xff1a; 1. 安装 Java 环境 Android Studio 需要 Java 运行环境&#xff0c;通常使用 OpenJDK 11 或更高版本。 sudo apt update sudo apt install openjdk-11-jdk2. 下载 Android Studio 从…

React第十节组件之间传值之context

1、Context 使用creatContext() 和 useContext() Hook 实现多层级传值 概述&#xff1a; 在我们想要每个层级都需要某一属性&#xff0c;或者祖孙之间需要传值时&#xff0c;我们可以使用 props 一层一层的向下传递&#xff0c;或者我们使用更便捷的方案&#xff0c;用 creatC…

基于群晖搭建个人图书架-TaleBook based on Docker

前言 在群晖Container Manager中部署失败&#xff0c;转通过ssh部署。 一、准备工作 名称备注群晖SSH“终端机和SNMP”中启用SSH软件secureCRT等docker-compose.ymlGithub下载并修改 二、过程 2.1 创建本地文件夹 本地路径为&#xff1a; /docker/Calibre/data 2.2 下载d…

【JavaEE】JavaEE、web 开发、框架(Spring) 、Maven

文章目录 一、JavaEE 发展历程二、什么是 web 开发1、什么是 web 开发&#xff1f;2、web 网站的工作流程 三、框架1、什么是框架&#xff1f;2、为什么要学框架&#xff1f;3、框架的优点&#xff08;Spring Boot VS Servlet&#xff09; 四、Maven 一、JavaEE 发展历程 Java…

vue3项目中使用星火API

在node环境epxress中使用讯飞ai接口进行二次封装&#xff0c;通过ai对话回复提取&#xff0c;获得ai提取的文章摘要 本文章只是简单使用&#xff0c;更复杂功能比如调用星火API制作对话机器人可以查看文档&#xff0c;对于初次使用星火AI接口或许有帮助 讯飞星火大模型API-大模…

基于centos7.9容器编排Jumpserver堡垒机

Jum 基础环境容器化部署MySQL容器化部署Redis容器化部署Nginx容器化部署Koko容器化部署Guacamole容器化部署Core编排compose文件 基础环境 基于centos7.9容器化部署jumpserver tar -xf JumpServer.tar.gz导入centos7.9 docker镜像 docker load -i images/centos_7.9.2009.ta…

5G学习笔记之PRACH

即使是阴天&#xff0c;也要记得出门晒太阳哦 目录 1. 概述 2. PRACH Preamble 3. PRACH Preamble 类型 3.1 长前导码 3.2 短前导码 3.3 前导码格式与小区覆盖 4. PRACH时频资源 4.1 小区所有可用PRACH资源 4.2 SSB和RACH的关系 4.3 PRACH时频资源配置 1. 概述 随机接入…

14 - Java 面向对象(中级)

包&#xff08;package&#xff09; 声明 java的包&#xff0c;类似电脑系统中的文件夹&#xff0c;包里存放的是类文件。 当类文件很多的时候&#xff0c;通常会采用多个包进行存放管理&#xff0c;这种方式称为分包管理。 在项目中&#xff0c;我们将相同功能的类放到一个…

【MMKV】HarmonyOS中的优秀轻量化存储方式

MMKV 引言 在移动应用开发的世界里&#xff0c;数据存储和管理是至关重要的一环。随着技术的不断进步&#xff0c;开发者们对于高性能、轻量级、易用的数据存储解决方案的需求日益增长。MMKV&#xff08;Memory Mapped Key-Value&#xff09;正是这样一个开源的高性能key-val…

「Mac畅玩鸿蒙与硬件34」UI互动应用篇11 - 颜色选择器

本篇将带你实现一个颜色选择器应用。用户可以从预设颜色中选择&#xff0c;或者通过输入颜色代码自定义颜色来动态更改界面背景。该应用展示了如何结合用户输入、状态管理和界面动态更新的功能。 关键词 UI互动应用颜色选择器状态管理用户输入界面动态更新 一、功能说明 颜色…

【Maven】依赖冲突如何解决?

准备工作 1、创建一个空工程 maven_dependency_conflict_demo&#xff0c;在 maven_dependency_conflict_demo 创建不同的 Maven 工程模块&#xff0c;用于演示本文的一些点。 什么是依赖冲突&#xff1f; 当引入同一个依赖的多个不同版本时&#xff0c;就会发生依赖冲突。…

【Vue3】从零开始创建一个VUE项目

【Vue3】从零开始创建一个VUE项目 手动创建VUE项目附录 package.json文件报错处理: Failed to get response from https://registry.npmjs.org/vue-cli-version-marker 相关链接&#xff1a; 【VUE3】【Naive UI】&#xff1c;NCard&#xff1e; 标签 【VUE3】【Naive UI】&…

Subprocess 和 Multiprocessing 的区别与使用要点及进程关闭方法

Subprocess 和 Multiprocessing 的区别与使用要点及进程关闭方法 最近在使用这两个库比较多&#xff0c;所以就借此机会记录一下这两个库的使用方式 一、Subprocess 和 Multiprocessing 的区别 1. 功能目标不同 Subprocess&#xff1a;主要用于在 Python 程序中启动外部程序…