图像认知与OpenCV——图像预处理

目录

一、颜色加法

颜色加法

颜色加权加法

示例

二、颜色空间转换 

RGB转Gray(灰度)

RGB转HSV

HSV转RGB

示例

三、灰度化

最大值法

平均值法

加权平均值法

四、图像二值化处理

 阈值法

反阈值法

截断阈值法

低阈值零处理

超阈值法

OTSU

自适应二值化

均值

加权求和

五、图像翻转

总结


一、颜色加法

可以使用OpenCV的cv.add()函数把两幅图像相加,或者可以简单地通过numpy操作添加两个图像,如res = img1 + img2。两个图像应该具有相同的大小和类型。

颜色加法

OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作,而Numpy添加是模运算。

# 饱和操作: cv.add(img1,img2)
# Numpy直接相加是取模运算,如250+10 = 260%256 = 4
x = np.uint8([[250]])
y = np.uint8([[10]])
xy1 = cv.add(x,y)
xy2 = x + y
print(xy1,xy2)

xy1采用OpenCV中的饱和运算,最大值为255,因为250+10=260>255,所以xy1=255

xy2采用Numpy的加法,采用去摸运算,结果与256取模运算,260%255=4,所以xy2=4

颜色加权加法

cv.addWeighted(img1,alpha,img2,beta,gamma)
结果:img1*alpha+img2*beta+gamma

img1,img2为图片数据(数组)

alpha,beta为权重

gamma为亮度调整值

  • gamma > 0,图像会变亮。

  • gamma < 0,图像会变暗。

  • gamma = 0,则没有额外的亮度调整。

示例

import cv2 as cv
import numpy as np# 读取图片
cao = cv.imread("../images/cao.png")
pig = cv.imread("../images/pig.png")
# 饱和操作: cv.add(img1,img2)
dst1 = cv.add(cao,pig)
# print(cao)
# print(pig)
# print(dst1)
cv.imshow('dst1',dst1)# Numpy直接相加是取模运算,如250+10 = 260%256 = 4
dst2 = cao + pig
cv.imshow('dst2',dst2)# 颜色加权加法: cv.addWeighted(img1,alpha,img2,beta,gamma) : img1*alpha+img2*beta+gamma
dst3 = cv.addWeighted(pig,0.7,cao,0.3,0)
cv.imshow('dst3',dst3)cv.waitKey(0)
cv.destroyAllWindows()

二、颜色空间转换 

cv.cvtColor(img,code)

RGB转Gray(灰度)

code = cv.COLOR_BGR2GRAY

RGB转HSV

code = cv.COLOR_BGR2HSV

HSV转RGB

code = cv.COLOR_BGR2RGB

示例

import cv2 as cv
# 读取图片
img = cv.imread("../images/1.jpg")
# 颜色转换 cv.cvtColor(img,code)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow('gray',gray)
# 转HSV
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
cv.imshow('hsv',hsv)
# 转RGB
rgb = cv.cvtColor(img,cv.COLOR_BGR2RGB)
cv.imshow('rgb',rgb)cv.waitKey(0)
cv.destroyAllWindows()

三、灰度化

最大值法

对于彩色图像的每个像素,它会从R、G、B三个通道的值中选出最大的一个,并将其作为灰度图像中对应位置的像素值。

import cv2 as cv
import numpy as np# 读取图片
pig = cv.imread("../images/pig.png")
img = np.zeros((pig.shape[0],pig.shape[1]),dtype=np.uint8)
# 循环遍历
for i in range(pig.shape[0]):for j in range(pig.shape[1]):img[i,j] = max(pig[i,j,:])
cv.imshow("img",img)
cv.waitKey(0)
cv.destroyAllWindows()

平均值法

对于彩色图像的每个像素,它会将R、G、B三个通道的像素值全部加起来,然后再除以三,得到的平均值就是灰度图像中对应位置的像素值。

import cv2 as cv
import numpy as np# 读取图片
pig = cv.imread("../images/pig.png")
img = np.zeros((pig.shape[0],pig.shape[1]),dtype=np.uint8)
# 循环遍历
for i in range(pig.shape[0]):for j in range(pig.shape[1]):# int():转为更大的数据类型,防止溢出img[i,j] = (int(pig[i,j,0])+int(pig[i,j,1])+int(pig[i,j,2]))//3cv.imshow('img', img)
cv.waitKey(0)
cv.destroyAllWindows()

注:图像数据都是整数,需要转换为int型,结果也必须为整数,所以整除

加权平均值法

对于彩色图像的每个像素,它会按照一定的权重去乘以每个通道的像素值,并将其相加,得到最后的值就是灰度图像中对应位置的像素值。

import cv2 as cv
import numpy as np# 读取图片
pig = cv.imread("../images/pig.png")
img = np.zeros((pig.shape[0],pig.shape[1]),dtype=np.uint8)
# 定义权重
wb,wg,wr=0.114,0.587,0.299# 循环遍历
for i in range(pig.shape[0]):for j in range(pig.shape[1]):img[i,j] = round(wb*pig[i,j,0])+round(wg*pig[i,j,1])+round(wr*pig[i,j,2])cv.imshow("img",img)
cv.waitKey(0)
cv.destroyAllWindows()

四、图像二值化处理

将某张图像的所有像素改成只有两种值之一

操作的图像必须为灰度图,所以处理前需要进行灰度化处理

_,binary = cv2.threshold(img,thresh,maxval,type)

  • img:输入图像,要进行二值化处理的灰度图。

  • thresh:设定的阈值。当像素值大于(或小于,取决于阈值类型)thresh时,该像素被赋予的值。

  • type:阈值处理的类型。

  • 返回值:

    • 第一个值(通常用下划线表示):计算出的阈值,若使用自适应阈值法,会根据算法自动计算出这个值。

    • 第二个值(binary):二值化后的图像矩阵。与输入图像尺寸相同。

 阈值法

将灰度图中的每一个像素值与该阈值进行比较,小于等于阈值的像素就被设置为0(通常代表背景),大于阈值的像素就被设置为maxval

type = cv.THRESH_BINARY

反阈值法

与阈值法相反。反阈值法是当灰度图的像素值大于阈值时,该像素值将会变成0(黑),当灰度图的像素值小于等于阈值时,该像素值将会变成maxval

type = cv.THRESH_BINARY_INV

截断阈值法

截断阈值法,指将灰度图中的所有像素与阈值进行比较,像素值大于阈值的部分将会被修改为阈值,小于等于阈值的部分不变

type = cv.THRESH_TRUNC

低阈值零处理

低阈值零处理,像素值小于等于阈值的部分被置为0(也就是黑色),大于阈值的部分不变。

type = cv.THRESH_TOZERO

超阈值法

超阈值零处理,与低阈值零处理相反,就是将灰度图中的每个像素与阈值进行比较,像素值大于阈值的部分置为0,像素值小于等于阈值的部分不变

type = cv.THRESH_TOZERO_INV

OTSU

OTSU算法就是在灰度图的像素值范围内遍历阈值T,使得g最大,基本上双峰图片的阈值T在两峰之间的谷底。

g就是前景与背景两类之间的方差,这个值越大,说明前景和背景的差别就越大,效果就越好。

THRESH_OTSU 通常与 THRESH_BINARYTHRESH_BINARY_INV 结合使用。

type = cv.THRESH_BINARY+cv.THRESH_OTSU  或 cv.THRESH_BINARY_INV+cv.THRESH_OTSU

手动设置的thresh值无效,阈值通过OTSU函数自动计算

自适应二值化

自适应二值化更加适合用在明暗分布不均的图片

自适应二值化方法会对图像中的所有像素点计算其各自的阈值

与OTSU类似,必须且只能结合一个阈值法或反阈值法

cv2.adaptiveThreshold(image_np_gray, maxval , cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, blockSize , c)

  • blockSize:选取的小区域的面积,如7就是7*7的小块。
  • c:最终阈值等于小区域计算出的阈值再减去此值

均值

根据选中点一定范围内的平均值作为阈值

    加权求和

    根据高斯权重核求加权,对小区域内的像素进行加权求和得到新的阈值,其权重值来自于高斯分布

    五、图像翻转

    • cv2.flip(img,flipcode)

    • 参数

      • im. 要翻转的图像

      • flipcode: 指定翻转类型的标志

        • flipcode=0: 垂直翻转,图片像素点沿x轴翻转

        • flipcode>0: 水平翻转,图片像素点沿y轴翻转

        • flipcode<0: 水平垂直翻转,水平翻转和垂直翻转的结合

    示例 

    import cv2 as cv# 读取图片
    face = cv.imread("../images/face.png")
    cv.imshow("face",face)
    # 图像翻转/镜像旋转 : 以图像中心为原点  cv.flip(img,flipCode)
    # flipCode = 0 : 垂直翻转
    flip_0 = cv.flip(face,0)
    cv.imshow('flip_0', flip_0)
    # flipCode = 1 : 水平翻转
    flip_1 = cv.flip(face,1)
    cv.imshow('flip_1', flip_1)
    # flipCode = -1 : 水平垂直翻转
    flip_2 = cv.flip(face,-1)
    cv.imshow('flip_2',flip_2)cv.waitKey(0)
    cv.destroyAllWindows()

     效果

    总结

    本文介绍了图像预处理中的一些内容,颜色加法包括平均值和加权加法,其中平均值包括OpenCV饱和加法与Numpy模运算加法;颜色空间转换包括灰度、RGB、HSV三者的转换;灰度化处理包括最大值法、平均值法、加权平均值法;图像二值化处理包括5种阈值方法和自适应二值化;图像反转包括水平翻转、垂直翻转、双向翻转。

    以上就是本章所有内容,感谢观看。

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

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

    相关文章

    Vue 3 组件通信全解析:从 Props 到 Pinia 的深入实践

    引言 Vue 3 作为现代前端框架的代表之一&#xff0c;以其灵活性和高效性受到开发者的广泛喜爱。在 Vue 3 中&#xff0c;组件是构建用户界面的核心单元&#xff0c;而组件之间的通信则是实现动态交互和数据流动的关键环节。无论是简单的父子组件通信&#xff0c;还是复杂的跨组…

    CodeBuddy IDE实战:用AI全栈能力快速搭建课程表网页

    声明&#xff1a;本文仅是实践测评&#xff0c;并非广告 1.前言 在数字化开发的浪潮中&#xff0c;工具的革新往往是效率跃迁的起点。腾讯云 CodeBuddy IDE 是 “全球首个产设研一体 AI 全栈开发平台” &#xff0c;它不仅打破了产品、设计与研发的职能壁垒&#xff0c;更重新…

    11. HTML 中 DOCTYPE 的作用

    总结H5 的声明HTML5 的 DOCTYPE 声明 HTML5 中的 <!DOCTYPE html> 声明用于告诉浏览器当前文档使用的是 HTML5 的文档类型。它必须是文档中的第一行内容&#xff08;在任何 HTML 标签之前&#xff09;&#xff0c;以确保浏览器能够正确地解析和渲染页面。DOCTYPE 的作用 …

    Linux C 网络基础编程

    基础知识在进行网络编程之前&#xff0c;我们需要简单回顾一下计算机网络五层模型的网络层和传输层&#xff0c;这两层在面向后端编程时用的最多。物理层和链路层过于底层&#xff0c;已经完全由内核协议栈实现&#xff0c;不再细述。这里假设读者已经对计算机网络有一个大致的…

    循环神经网络--NLP基础

    一、简单介绍NLP&#xff08;Natural Language Processing&#xff09;&#xff1a;自然语言处理是人工智能和语言领域的一个分支&#xff0c;它涉及计算机和人类语言之间的相互作用。二、NLP基础概念词表&#xff08;词库&#xff09;&#xff1a;文本数据集出现的所有单词的集…

    【Android】约束布局总结(1)

    三三要成为安卓糕手 零&#xff1a;创建布局文件方式 1&#xff1a;创建步骤ctrl alt 空格 设置根元素2&#xff1a;处理老版本约束布局 在一些老的工程中&#xff0c;constrainlayout可能没有办法被直接使用&#xff0c;这里需要手动添加依赖implementation androidx.const…

    S7-200 SMART 数字量 I/O 组态指南:从参数设置到实战案例

    在工业自动化控制中&#xff0c;PLC 的数字量输入&#xff08;DI&#xff09;和输出&#xff08;DO&#xff09;是连接传感器、执行器与控制系统的 “神经末梢”。西门子 S7-200 SMART 作为一款高性价比的小型 PLC&#xff0c;其数字量 I/O 的灵活组态直接影响系统的稳定性与响…

    可调谐激光器原理与设计 【DFB 与 DBR 激光器剖析】

    可调谐激光器原理与设计 【DFB 与 DBR 激光器剖析】1. 可调谐激光器的原理与分类简介2. DFB 与 DBR 激光器结构原理比较2.1 DFB&#xff08;Distributed Feedback Laser&#xff09;激光器2.2 DBR&#xff08;Distributed Bragg Reflector&#xff09;激光器2.3 DFB 激光器与 D…

    【前端工程化】前端项目开发过程中如何做好通知管理?

    在企业级后台系统中&#xff0c;通知是保障团队协作、监控系统状态和及时响应问题的重要手段。与 C 端产品不同&#xff0c;B 端更关注构建完成、部署状态、异常报警等关键节点的推送机制。 本文主要围绕通知场景、通知内容、通知渠道、自动化集成等方面展开&#xff0c;适用于…

    MySQL 9.4.0创新版发布,AI开始辅助编写发布说明

    2025 年 7 月 22 日&#xff0c;MySQL 9.4.0 正式发布。 作为一个创新版&#xff0c;MySQL 9.4.0 最大的创新应该就是使用 Oracle HeatWave GenAI 作为助手帮助编写版本发布说明了。难道下一步要开始用 AI 辅助编写数据库文档了&#xff1f; 该版本包含的核心功能更新以及问题修…

    基于WebSockets和OpenCV的安卓眼镜视频流GPU硬解码实现

    基于WebSockets和OpenCV的安卓眼镜视频流GPU硬解码实现 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c;觉得好请收藏。点击跳转到网站。 1. 项目概述 本项目旨在实现一个通过WebSockets接收…

    人大金仓 kingbase 连接数太多, 清理数据库连接数

    问题描述 kingbase 连接数太多, 清理数据库连接数 [rootFCVMDZSZNST25041 ~]# su root [rootFCVMDZSZNST25041 ~]# [rootFCVMDZSZNST25041 ~]# su kingbase [kingbaseFCVMDZSZNST25041 root]$ [kingbaseFCVMDZSZNST25041 root]$ ksql could not change directory to "/r…

    SpringMVC相关基础知识

    1. servlet.multipart 大小配置 SpringBoot 文件上传接口中有 MultipartFile 类型的文件参数,上传较大文件时报错: org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded; nested exception is java.lang.IllegalStateExceptio…

    HCIP第一次实验报告

    一.实验需求及拓扑图&#xff1a;二.实验需求分析根据提供的网络拓扑图和实验要求&#xff0c;以下是对实验需求的详细分析&#xff1a;R5作为ISP:R5只能进行IP地址配置&#xff0c;其所有接口均配置为公有IP地址。认证方式:R1和R5之间使用PPP的PAP认证&#xff0c;R5为主认证方…

    React入门学习——指北指南(第五节)

    React 交互性:过滤与条件渲染 在前文我们学习了 React 中事件处理和状态管理的基础。本节将聚焦两个重要的进阶技巧 ——条件渲染(根据状态动态显示不同 UI)和列表过滤(根据条件筛选数据),这两者是构建交互式应用的核心能力,能让界面根据用户操作呈现更智能的响应。 条…

    学习嵌入式的第二十九天-数据结构-(2025.7.16)线程控制:互斥与同步

    以下是您提供的文本内容的排版整理版本。我已根据内容主题将其分为几个主要部分&#xff08;互斥锁、信号量、死锁、IPC进程间通信、管道操作&#xff09;&#xff0c;并使用清晰的结构组织信息&#xff1a;代码片段用代码块格式&#xff08;指定语言为C&#xff09;突出显示。…

    COZE官方文档基础知识解读第六期 ——数据库和知识库

    一&#xff0c;一键直连数据上传&#xff0c;存储&#xff0c;使用 火山方舟的数据库和知识库的核心&#xff0c;都是基于开源的数据库产品&#xff08;mysql&#xff0c;向量数据库等&#xff09;&#xff0c;将数据库交互的逻辑封装在后端&#xff0c;与前端做耦合&#xff0…

    生产环境使用云服务器(centOS)部署和使用MongoDB

    部署MongoDB流程1. ​安装MongoDB​版本选择建议​CentOS 7​&#xff1a;推荐MongoDB 4.4.x&#xff08;兼容性好&#xff09;​CentOS 8/9​&#xff1a;建议最新稳定版&#xff08;如6.0&#xff09;&#xff0c;需单独安装mongodb-database-tools安装步骤1.添加官方仓库# 添…

    思博伦第二到三层测试仪(打流仪)TestCenter 2U硬件安装及机箱加电_双极未来

    &#xff08;1&#xff09;安装板卡&#xff1a;上图中共 4 个红色线框&#xff0c;上边两个红色线条框住的是机箱的左右两侧导轨&#xff0c;下边两条红色 线条框住的是板卡拉手条&#xff08;用于承载板卡PCB的金属板&#xff09;左右两边的边沿。 安装时将拉手条两边的边沿与…

    【华为】笔试真题训练_20250611

    本篇博客旨在记录自已的笔试刷题的练习&#xff0c;里面注有详细的代码注释以及和个人的思路想法&#xff0c;希望可以给同道之人些许帮助。本人也是小白&#xff0c;水平有限&#xff0c;如果文章中有什么错误或遗漏之处&#xff0c;望各位可以在评论区指正出来&#xff0c;各…