OpenCV入门(六)快速学会OpenCV5图像处理基础(二)像素处理

news2024/11/28 22:55:11

OpenCV入门(六)快速学会OpenCV5图像处理基础(二)

像素是图像构成的基本单位,像素处理是图像处理的基本操作,可以通过位置索引的形式对图像内的元素进行访问、处理。

1.二值化操作

需要说明的是,在OpenCV中,最小的数据类型是无符号的8位数。

因此,在OpenCV中实际上并没有二值图像这种数据类型,二值图像经常是通过处理得到的,然后使用0表示黑色,使用255表示白色。可以将二值图像理解为特殊的灰度图像。

在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。

声明如下:

ret, dst = cv2.threshold(src, thresh, maxval, type)

参数:

src: 需要转换的图
thresh: 阈值
maxval: 超过阈值所赋的值
type: 二值化操作类型
返回值:

ret: 输入的阈值
dst: 处理好的图片

原图如下所示:
在这里插入图片描述

1.1 Binary

大于阈值的设为 255, 低于或等于阈值的为 0。

实例代码:

import cv2 as cv

img_gray = cv.imread("test.jpg")

# 二值化
ret, thresh1 = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY)

# 图片展示
cv.imshow("thresh1", thresh1)
cv.waitKey(0)
cv.destroyAllWindows()

输出结果:
在这里插入图片描述

1.2 Binary Inverse

与 Binary 相反。

代码实例:

import cv2 as cv

img_gray = cv.imread("test.jpg")

# 二值化
ret, thresh1 = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY)
ret, thresh2 = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY_INV)
# 图片展示
cv.imshow("thresh1", thresh1)
cv.imshow("thresh2", thresh2)
cv.waitKey(0)
cv.destroyAllWindows()

输出结果:

在这里插入图片描述

1.3 Trunc

大于阈值的设为 255, 低于或等于阈值的不变。

代码实例:

import cv2 as cv

img_gray = cv.imread("test.jpg")

# 二值化
ret, thresh1 = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY)
ret, thresh2 = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY_INV)
ret, thresh3 = cv.threshold(img_gray, 127, 255, cv.THRESH_TRUNC)
# 图片展示
cv.imshow("thresh1", thresh1)
cv.imshow("thresh2", thresh2)
cv.imshow("thresh3", thresh3)
cv.waitKey(0)
cv.destroyAllWindows()

输出结果:

在这里插入图片描述

1.4 Tozero

大于阈值部分不变, 否则设为 0。

代码实例:

import cv2 as cv

img_gray = cv.imread("test.jpg")

# 二值化
ret, thresh1 = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY)
ret, thresh2 = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY_INV)
ret, thresh3 = cv.threshold(img_gray, 127, 255, cv.THRESH_TRUNC)
ret, thresh4 = cv.threshold(img_gray, 127, 255, cv.THRESH_TOZERO)
# 图片展示
cv.imshow("thresh1", thresh1)
cv.imshow("thresh2", thresh2)
cv.imshow("thresh3", thresh3)
cv.imshow("thresh4", thresh4)
cv.waitKey(0)
cv.destroyAllWindows()

输出结果:

在这里插入图片描述

1.5 Tozero Inverse

与 Tozero 相反。

代码实例:

import cv2 as cv

img_gray = cv.imread("test.jpg")

# 二值化
ret, thresh1 = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY)
ret, thresh2 = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY_INV)
ret, thresh3 = cv.threshold(img_gray, 127, 255, cv.THRESH_TRUNC)
ret, thresh4 = cv.threshold(img_gray, 127, 255, cv.THRESH_TOZERO)
ret, thresh5 = cv.threshold(img_gray, 127, 255, cv.THRESH_TOZERO_INV)
# 图片展示
cv.imshow("thresh1", thresh1)
cv.imshow("thresh2", thresh2)
cv.imshow("thresh3", thresh3)
cv.imshow("thresh4", thresh4)
cv.imshow("thresh5", thresh5)
cv.waitKey(0)
cv.destroyAllWindows()

输出结果:

在这里插入图片描述

2.颜色转换

灰度转换:

如果拍照时曝光不足或曝光过度,照片会灰蒙蒙的或者过白,这实际上是因为对比度太小、输入图像亮度分量的动态范围较小造成的,例如x光照片或陆地资源卫星多光谱图像。改善这些图像的质量可以采用灰度变换法,通过扩展输入图像的动态范围达到图像增强的目的。

灰度变换是图像处理最基本的方法之一,灰度变换可使图像动态范围加大、图像对比度增强、图像清晰、特征明显,是图像增强的重要手段。图像的灰度变换又称为灰度增强,是根据某种目标条件按一定变换关系逐点改变原图像中每一个像素灰度值的方法。

灰度变换主要利用点运算来修正像素灰度,由输入像素点的灰度值确定相应输出点的灰度值,是一种基于图像变换的操作。灰度变换不改变图像内的空间关系,除了灰度级的改变是根据特定的灰度函数变换进行之外,可以看作是“从像素到像素”复制操作,基于点运算的灰度变换可表示为s=T®。

其中,T是灰度变换函数,描述输入灰度值和输出灰度值之间的关系,一旦灰度变换函数确定,该灰度变换就被完全确定下来;r是变换前的灰度;s是变换后的像素。

灰度变换的作用:
(1)改善图像的质量,使图像能够显示更多的细节,提高图像的对比度(对比度拉伸)。
(2)有选择地突出图像感兴趣的特征,或者抑制图像中不需要的特征。
(3)可以有效地改变图像的直方图分布,使像素的分布更为均匀。

灰度变换函数描述了输入灰度值和输出灰度值之间的变换关系,一旦灰度变换函数确定下来,那么其输出的灰度值也就确定了。灰度变换函数的性质决定了灰度变换所能达到的效果。

cv.cvtColor可以帮助我们转换图片通道。

声明如下:

cv2.cvtColor(src, code[, dst[, dstCn]])

参数:

src: 需要转换的图片
code: 颜色空间转换码
dst: 输出图像大小深度相同, 可选参数
desCn: 输出图像的颜色通道, 可选参数

2.1 灰度转换

RGB 到灰度图转换公式:

Y' = 0.299 R + 0.587 G + 0.114 B

代码实例:

import cv2 as cv

img = cv.imread("test.jpg")

# 转换成灰度图
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 输出维度
print(img_gray.shape)  # (554, 640)

# 展示图像
cv.imshow("img_gray", img_gray)
cv.waitKey(0)
cv.destroyAllWindows()

输出结果:

在这里插入图片描述

2.2 HSV

HSV (Hue, Saturation, Value) 是根据颜色的直观特性由 A.R. Smith 在 1978 年创建的一种颜色空间。

代码实例:

import cv2 as cv

img = cv.imread("test.jpg")

# 转换成灰度图
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 转换成hsv
img_hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
# 输出维度
print(img_gray.shape)  # (554, 640)
print(img_hsv.shape)  # (554, 640, 3)
# 展示图像
cv.imshow("img_gray", img_gray)
cv.imshow("img_hsv", img_hsv)
cv.waitKey(0)
cv.destroyAllWindows()

输出结果:

在这里插入图片描述

2.3 YUV

YUV 是一种颜色编码的方法, 主要用在视频, 图形处理流水线中。

代码实例:

import cv2 as cv

img = cv.imread("test.jpg")

# 转换成灰度图
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 转换成hsv
img_hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
# 转换成hsv
img_yuv = cv.cvtColor(img, cv.COLOR_BGR2YUV)

# 输出维度
print(img_gray.shape)  # (554, 640)
print(img_hsv.shape)  # (554, 640, 3)
print(img_yuv.shape)  # (554, 640, 3)
# 展示图像
cv.imshow("img_gray", img_gray)
cv.imshow("img_hsv", img_hsv)
cv.imshow("img_yuv", img_yuv)
cv.waitKey(0)
cv.destroyAllWindows()

输出结果:

在这里插入图片描述

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

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

相关文章

2023年上半年北京杭州/广州深圳软考中/高级报名入口

软考是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。 系统集成…

【人脸识别】ssd + opencv Eigenfaces 和 LBPH算法进行人脸监测和识别

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言ssd opencv Eigenfaces 和 LBPH算法进行人脸监测和识别1. ssd 目标监测2.opencv的三种人脸识别方法2.1 Eigenfaces2.2 LBPH前言 ssd opencv Eigenfaces 和 LB…

hadoop的补充配置与常用脚本

目录 历史服务器的配置: 添加配置: 分发集群: 日志聚集功能的配置: 添加配置: 分发配置给集群其他服务器: 集群的启动与停止: 整体启动和停止hdfs: 整体启动/停止YARN 启动…

微服务为什么要用到 API 网关?

本文介绍了 API 网关日志的价值,并以知名网关 Apache APISIX 为例,展示如何集成 API 网关日志。 作者程小兰,API7.ai 技术工程师,Apache APISIX Contributor。 原文链接 什么是微服务 微服务架构(通常简称为微服务&a…

Promise.all、Promise.race、Promise.allSettled、Promise.any区别

1.Promise.all Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。 const p Promise.all([p1, p2, p3]); p的状态由p1,p2,p3 决定,分成两种情况。 (1)只有p1、p2、p3的状态都变成fulfilled&#xff0c…

LeetCode - 42 接雨水

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 42. 接雨水 - 力扣(LeetCode) 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例1 输入&…

金融交易行为监测方法——利用 CNN 模型实现行为识别

背景介绍在证劵交易所领域,曾经发生用户证券账号被盗事件,导致客户资产损失,例如:黑客获得了用户A的证券账号密码,利用多次的低买高卖将资产转移。本文中针对此类对敲欺诈的场景,采用将用户交易数据转换为图…

头脑风暴(一):Controller层前端传参接收;在Service层实现类中?为何要build相关构建器?添加套餐业务分析

文章目录1 MyBatis中Controller层List集合接收数据,泛型添加与否1.1 案例场景1.2 应该用什么接收1.3 是否可以用其他方式接收?1.4 LIst集合接收可否不指定泛型1.5 mybatis中使用基本类型接收数据?resultType是集合中的元素的类型,…

论文阅读笔记《GAMnet: Robust Feature Matching via Graph Adversarial-Matching Network》

核心思想 本文提出一种基于图对抗神经网络的图匹配算法(GAMnet),使用图神经网络作为生成器分别生成源图和目标图的节点的特征,并用一个多层感知机作为辨别器来区分两个特征是否来自同一个图,通过对抗训练的办法提高生成器特征提取…

uniCloud基础使用-好文

云函数可以看做java或者php,作为后端服务cloudfunctions/myCloud/index.jsexports.main async (event, context) > {const { name, age } eventreturn 我是${name},今年${age} };pages/index/index.vue//callFunction方法 在前端和云端都可以调用另一个云函数 …

三十而立却被裁,打工人要如何应对职场危机?

又到金三银四就业季,对于部分职场人来说,年龄成为了他们找工作的最大限制。 因为绝大部分企业招聘中层干部以下岗位的时候,都会要求年龄不超过35周岁,再加上每年千万毕业生涌入社会,竞争程度相当激烈,这就导…

QML 模型(ListModel)

LIstModel(列表模型) ListModel 是ListElement定义的简单容器,每个定义都包含数据角色。内容可以在 QML 中动态定义或显式定义。 属性: count模型中数据条目的数量dynamic动态角色,默认情况下,角色的类型…

Android 进程间通信机制(一) IPC概念和模型

一. 前言 一直想把Binder机制认识清楚, 但是它涉及Android系统的Framework, Native, kernel层, 就需要你要有 C C基础阅读底层源码的能力, 目前笔者的水平,对Binder 在Native 和kernel层的实现原理和机制也是懵逼状态, 真的是博大精深, 故现阶段先把看懂和理解清楚的整理出来…

内核链表分析

内核链表 文章目录内核链表list_head创建链表添加节点1. list_add2. list_add_tail 接口删除节点宿主结构1.找出宿主结构 list_entry(ptr, type, member)2 container_of3. 宿主结构的遍历list_head 在 Linux 内核中,提供了一个用来创建双向循环链表的结构 list_hea…

海康摄像头使用RTSP

1.协议格式。海康威视IP摄像头rtsp协议地址如下:rtsp://[username]:[passwd][ip]:[port]/[codec]/[channel]/[subtype]/av_stream主码流:rtsp://admin:12345192.168.1.64:554/h264/ch1/main/av_streamrtsp://admin:12345192.168.1.64:554/MPEG-4/ch1/mai…

SpringCloud微服务保护

微服务保护微服务保护1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.超时处理1.1.3.仓壁模式1.1.4.断路器1.1.5.限流1.1.6.总结1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel1.4.微服务整合Sentinel2.流量控制2.1.簇点链路2.1.…

java基础学习 day51 (匿名内部类)

1. 什么是匿名内部类? 隐藏了名字的内部类,实际名字为:外部类名$序号可以写在成员位置,为没有名字的成员内部类也可以写在局部位置,为没有名字的局部内部类 2. 匿名内部类的格式? new 类名/接口名() { 重…

深入理解AQS

概念设计初衷:该类利用 状态队列 实现了一个同步器,更多的是提供一些模板方法(子类必须重写,不然会抛错)。 设计功能:独占、共享模式两个核心,state、Queue2.1 statesetState、compareAndSetSta…

SpringMVC简单仿写

之前我分享过SpringMVC的基本原理与配置(原文链接:https://blog.csdn.net/L170311/article/details/129339120),为了更深层次的学习,精益求精,手动仿写了一个MVC原理实现demo,一起学习一下吧 结构目录&…

使用预训练模型自动续写文本的四种方法

作者:皮皮雷 来源:投稿 编辑:学姐 这篇文章以中文通用领域文本生成为例,介绍四种常用的模型调用方法。在中文文本生成领域,huggingface上主要有以下比较热门的pytorch-based预训练模型: 本文用到了其中的ue…