OpenCV(七)——灰度图像的阙值处理以及图像的边界填充

灰度图像的阙值处理

在OpenCV中利用threshold()对灰度图像进行阙值处理,该函数通过将图像中的每个像素值与一个给定的阈值进行比较来工作。如果像素值超过这个阈值,那么像素值将被设置成指定的最大值;如果没有超过阈值,则根据不同的阈值类型,可能会被设置为0或者保持原值。其中有5中基本类型的阙值。

注:五种基本类型的阙值分别和作用分别为:

  • cv2.THRESH_BINARY: 当像素值超过阈值时,设置像素值为最大值,否则设置为0。
  • cv2.THRESH_BINARY_INV: 与cv.THRESH_BINARY相反,当像素值超过阈值时设置为0,否则设置为最大值。
  • cv2.THRESH_TRUNC: 当像素值超过阈值时,设置像素值为阈值,而不是最大值。
  • cv.THRESH_TOZERO: 当像素值超过阈值时保持不变,否则设置为0。
  • cv2.THRESH_TOZERO_INV: 与cv.THRESH_TOZERO相反,当像素值超过阈值时设置为0,否则保持不变。

例如:

import cv2
import matplotlib.pyplot as plt
import numpy as np

img=cv2.imread(r'D:\Photo\1.jpeg')
ret,thresh1=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret,thresh2=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret,thresh4=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret,thresh5=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)

titles=['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images=[img,thresh1,thresh2,thresh3,thresh4,thresh5]

for i in range(6):
    cv2.imshow(titles[i],images[i])
cv2.waitKey(0)
cv2.destroyAllWindows()

这段代码是使用OpenCV库对图像进行阈值处理,并显示处理后的图像。首先导入所需的库,然后读取一张图片并将其转换为灰度图像。接着使用不同的阈值处理方法对灰度图像进行处理,包括二值化、反二值化、截断和零处理等。最后将处理后的图像显示出来。

运行结果如下所示(六张图两两一组):

原图和BINARY

BINARY_INY和TRUNC

TOZERO和TOZERO_INV​​​​​​

在上面所有的图片中,阙值被设定为了127。在TERESH_BINARY中,如果图像中的像素点超过127设置为最大值(白色部分),没超过则直接变为0(黑色部分);在TERESH_BINARY_INV中,如果图像的像素点超过127直接变为0(黑色部分),否则设置为最大值(白色部分),可以看到TERESH_BINARY_INV与TERESH_BINARY是内容黑白完全相反的;在TERESH_TRUNC中,超过阙值的部分设置为阙值大小(执行后图像内没有超过阙值的像素);在TERESH_TOZERO中,超过阙值的部分保持不变,其余部分变为0(黑色部分);TERESH_TOZERO_INV中,超过阙值的部分变为0(黑色部分),没超过的部分保持不变。

边界填充

在OpenCV中,使用copyMakeBorder()函数对于边界进行填充。在copyMakeBorder()函数中,需要有几个参数,基本形式是:cv2.copyMakeBorder(src, top, bottom, left, right, borderType, value),对其基本形式的解释是:

  • src:输入图像。
  • top:上边框的宽度。
  • bottom:下边框的宽度。
  • left:左边框的宽度。
  • right:右边框的宽度。
  • value:当borderTypecv2.BORDER_CONSTANT时,用于填充边框的颜色值。
  • borderType:边框类型,可以是以下几种之一:
  1. cv2.BORDER_REPLICATE:复制最边缘的像素来填充边框。
  2. cv2.BORDER_REFLECT:反射图像边界像素来填充边框。
  3. cv2.BORDER_REFLECT_101:类似于cv2.BORDER_REFLECT,但略有不同。
  4. cv2.BORDER_WRAP:将图像边界像素循环复制到边框区域。
  5. cv2.BORDER_CONSTANT:使用指定的常量值填充边框。

 下面我们可以比较不同的情况下,不同的边框类型所产生的不同影响。如下这个示例:

import cv2
import matplotlib.pyplot as plt
import numpy as np

img=cv2.imread(r'D:\Photo\1.jpeg')
top_size,botton_size,left_size,right_size=(50,50,50,50)
img_replicate=cv2.copyMakeBorder(img,top_size,botton_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
img_reflect=cv2.copyMakeBorder(img,top_size,botton_size,left_size,right_size,borderType=cv2.BORDER_REFLECT)
img_reflect101=cv2.copyMakeBorder(img,top_size,botton_size,left_size,right_size,borderType=cv2.BORDER_REFLECT_101)
img_wrap=cv2.copyMakeBorder(img,top_size,botton_size,left_size,right_size,borderType=cv2.BORDER_WRAP)
img_constant=cv2.copyMakeBorder(img,top_size,botton_size,left_size,right_size,borderType=cv2.BORDER_CONSTANT,value=0)

res=[img,img_replicate,img_reflect,img_reflect101,img_wrap,img_constant]
titles=['ORIGINAL','REPLICATE','REFLECT','REFLECT_101','WRAP','CONSTANT']

for i in range(6):
    plt.subplot(2,3,i+1)
    plt.imshow(res[i],'gray')
    plt.title(titles[i])

plt.show()

运行结果如下所示:

可以看到图片1为原图;在图片2中直接是以图片的边框所在的像素内容为扩展(可以看到图片2中很多是直线形状的); 而图片3的内容,是通过映射原图像的内容(可以看到图3的内容有对称的部分);而图片4的的内容与图3类似;图片5就是循环填充,就是将像素平铺展示;而图片6就是将图片扩展的部分直接设置成了黑色。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言例:设 int a=11; 则表达式 a+=a-=a*a 的值

注&#xff1a;软件为VC6.0 代码如下&#xff1a; #include<stdio.h> int main(void) {int a11, b;b (aa-a*a); //a*a121 -->a-121结果为a-110 -->a-110结果为a-220printf("表达式aa-a*a 的值为&#xff1a; %d\n",b);return 0; } //优先级&#x…

组播协议详解

1.组播基础 &#xff08;1&#xff09;组播简介 &#xff08;2&#xff09;组播的地址 &#xff08;3&#xff09;组播的MAC地址 &#xff08;4&#xff09;组播的MAC地址 &#xff08;5&#xff09;反向转发路径—RPF 2.IGMP &#xff08;1&#xff09;简介 &#xff0…

vite ts vue 项目提示 . Projects must list all files or use an include pattern.

vite ts vue 项目提示 . Projects must list all files or use an include pattern. 在引用一个 ts 的时候&#xff0c;提示如下&#xff1a; 需要在 tsconfig.node.json 文件中添加&#xff1a; {"compilerOptions": {"composite": true,"skipLibC…

【LLM】LLama2模型(RMSNorm、SwiGLU、RoPE位置编码)

note 预训练语言模型除了自回归&#xff08;Autoregressive&#xff09;模型GPT&#xff0c;还有自编码模型&#xff08;Autoencoding&#xff09;BERT[1]、编-解码&#xff08;Encoder-Decoder&#xff09;模型BART[67]&#xff0c;以及融合上述三种方法的自回归填空&#xf…

一文速通ESP32(基于MicroPython)——含示例代码

ESP32 简介 ESP32-S3 是一款集成 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE) 的 MCU 芯片&#xff0c;支持远距离模式 (Long Range)。ESP32-S3 搭载 Xtensa 32 位 LX7 双核处理器&#xff0c;主频高达 240 MHz&#xff0c;内置 512 KB SRAM (TCM)&#xff0c;具有 45 个可编程 GPIO 管…

ttkbootstrap界面美化系列之简介(一)

一&#xff1a;前言 相信很多同学用Python进行界面设计第一个用到的就是Tkinter&#xff0c;Tkinter是Python的一个标准接口&#xff0c;用于创建GUI&#xff08;图形用户界面&#xff09;应用程序。它是Tcl/Tk的封装&#xff0c;Tkinter的名称来源于Tk技术工具包(Tool…

2024 Mazing 3 中文版新功能介绍Windows and macOS

iMazing 3中文版(ios设备管理软件)是一款管理苹果设备的软件&#xff0c; Windows 平台上的一款帮助用户管理 IOS 手机的应用程序。iMazing中文版与苹果设备连接后&#xff0c;可以轻松传输文件&#xff0c;浏览保存信息等&#xff0c;软件功能非常强大&#xff0c;界面简洁明晰…

Outlook API发送邮件的方法?如何设置接口?

如何使用Outlook API发送电子邮件&#xff1f;怎么调用API接口&#xff1f; 为了满足更高级别的需求&#xff0c;我们可能需要通过编程的方式来操作Outlook&#xff0c;这时候&#xff0c;Outlook API就显得尤为重要了。那么&#xff0c;如何使用Outlook API发送邮件呢&#x…

Linux下的多线程编程:原理、工具及应用(3)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;Flower of Life—陽花 0:34━━━━━━️&#x1f49f;──────── 4:46 &#x1f504; ◀️ ⏸ ▶️ ☰ …

从零到一构建短链接系统(五)

1.修改UserService Service public class UserServiceImpl extends ServiceImpl<UserMapper, UserDO> implements UserService {public UserRespDTO getUserByUsername(String username) {LambdaQueryWrapper<UserDO> queryWrapper Wrappers.lambdaQuery(UserDO.c…

【python】集合

前言 简洁整理&#xff0c;无废话 集合概念 含义&#xff1a;跟数学中的基本一样 形式&#xff1a;{1,a,(1,2)} 性质&#xff1a;不重复性&#xff0c;集合中每个元素不会有重复&#xff1b;集合中必须是不可变元素&#xff0c;不能有列表可以有元组 创建&#xff1a;{}或…

如何引入ElementUI组件库,快速上手Element

前言&#xff1a;在上篇文章中分享了如何快速上手Vue框架项目&#xff0c;本篇文章则介绍的是Element的使用&#xff0c;通过本篇文章的分享&#xff0c;我们就可以将Vue和Element结合使用&#xff0c;快速构建出精美的网页界面 目录 一.Element和ElementUI 二.如何引入Eleme…

算法打卡day19|二叉树篇08|Leetcode 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

算法题 Leetcode 235. 二叉搜索树的最近公共祖先 题目链接:235. 二叉搜索树的最近公共祖先 大佬视频讲解&#xff1a;二叉搜索树的最近公共祖先视频讲解 个人思路 昨天做过一道二叉树的最近公共祖先&#xff0c;而这道是二叉搜索树&#xff0c;那就要好好利用这个有序的特点…

Luckysheet + Exceljs:H5实现Excel在线编辑、导入、导出及上传服务器的示例代码(完整版demo)

创建xeditor.html <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>Hello World!</title><!-- <link relstylesheet href./luckysheet/plugins/css/pluginsCss.css /><link relstylesheet href./luck…

【嵌入式实践】【芝麻】【硬件篇-3】从0到1给电动车添加指纹锁:光耦+继电器电路设计及讲解

0. 前言 该项目是基于stm32F103和指纹模块做了一个通过指纹锁控制电动车的小工具。支持添加指纹、删除指纹&#xff0c;电动车进入P档等待时计时&#xff0c;计时超过5min则自动锁车&#xff0c;计时过程中按刹车可中断P档状态&#xff0c;同时中断锁车计时。改项目我称之为“芝…

Chapter 13 Techniques of Design-Oriented Analysis: The Feedback Theorem

Chapter 13 Techniques of Design-Oriented Analysis: The Feedback Theorem 从这一章开始讲负反馈Control系统和小信号建模. 13.2 The Feedback Theorem 首先介绍 Middlebrook’s Feedback Theorem 考虑下面负反馈系统 传输函数 Guo/ui G ( s ) u o u i G ∞ T 1 T G…

7.Java整合MongoDB—项目创建

整合MongoDB MongoDB的基本知识有所了解之后&#xff0c;我们开始着手上代码了&#xff0c;进来先来项目创建&#xff0c;如何引入mongodb&#xff0c;以及测试一下能否连接数据库。 1 新建springboot项目 其实只需要spring boot mongodb这个依赖就行&#xff0c;加那么多纯属…

sparksql简介

什么是sparksql sparksql是一个用来处理结构话数据的spark模块&#xff0c;它允许开发者便捷地使用sql语句的方式来处理数据&#xff1b;它是用来处理大规模结构化数据的分布式计算引擎&#xff0c;其他分布式计算引擎比较火的还有hive&#xff0c;map-reduce方式。 sparksql…

基于单片机的智能小车泊车系统设计

摘 要:随着信息技术的进步,汽车逐渐朝着安全、智能方向发展,智能泊车系统的出现不仅能帮助人们更加快速、安全地完成泊车操作,而且适用于狭小空间的泊车操作,降低驾驶员泊车负担,减轻泊车交通事故发生率。文章基于单片机设计自动泊车系统,以单片机为核心来实现信息收集及…

文件系统I/O FATFS RW 源码分析

文件系统I/O FATFS RW 源码分析 0 参考 FatFs 是用于小型嵌入式系统的通用 FAT/exFAT 文件系统模块。FatFs 整个项目都按照 ANSI C (C89) 编写。与存储器 I/O 解耦良好&#xff0c;便于移植到 8051、PIC、AVR、ARM、Z80、RX 等小型微控制器中。 下面是关于 FAT 文件系统格式…