python图像处理实战(二)—二值化图像与线性变换

news2024/11/20 14:25:48

🚀写在前面🚀

🖊个人主页:https://blog.csdn.net/m0_52051577?type=blog 

🎁欢迎各位大佬支持点赞收藏,三连必回!!

🔈本人新开系列专栏—python图像处理

❀愿每一个骤雨初晴之时,所有的蜻蜓振翅和雨后惊雷,都归你。

前言

        首先引入以下灰度变换的概念。

        灰度变换是指根据某种目标条件按一定变换关系逐点改变源图像中每一个像素灰度值的方法。目的是 为了改善画质,使图像的显示效果更加清晰。 图像的灰度变换处理是图像增强处理技术中的一种非常基础、直接的空间域图像处理方法,也是图像数字化软件和图像显示软件的一个重要组成部分。——来自百度百科

        这里采用opencv中的二值化相关方法进行灰度处理,进行灰度变换的非线性变换。

目录

一、所需函数

二、图像基本知识

1、自定义图像

 2、三种常见图像相互转换

3、通道分离与合并 

三、图像运算

 四、实例


 注:本文涉及到的图片资源可在博客积分资源中获取,相关链接:https://download.csdn.net/download/m0_52051577/87844285?spm=1001.2014.3001.5503

一、所需函数

## 1. 图像读取
img = cv.imread()

## 2. 彩色图转灰度图
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

## 3. 二值化图像(灰度图转二值图)
_, img_bin = cv.threshold(img_gray, th1, th2, cv.THRESH_BINARY)

## 4. 保存图像
cv.imwrite('pic/bear_gray.jpg', img_gray)

## 5. 通道分离
b, g, r = cv.split(img)

## 6. 通道合并
img_new = cv.merge([b, g, r])

## 7. 两图像相加、相减、相乘、相除
img = cv.add(img1, img2)
img = cv.subtract(img1, img2)
img = cv.multiply(img1, img2)
img = cv.divide(img1, img2)

二、图像基本知识

1、自定义图像

b = np.array([
    [0, 127, 255],
    [255, 0, 255],
    [10, 50, 100]
], dtype=np.uint8)

g = b.T
r = b - g

# show(b)
show(cv.merge([b, g, r]))

# cv.imwrite()

 

注:其中,b矩阵中的三个行向量分别表示纯色图像,其中0表示纯黑,255表示纯白。g表示b的转置矩阵,r则是将b与g矩阵对应元素相减,最后再用merge函数将b,g,r三个单通道的纯色图像合并成一张真彩色三通道图像。 

RGB颜色对照表链接:RGB颜色对照表

 2、三种常见图像相互转换

首先预先定义函数。 若图片的维度为2,即灰度图,则读取并展示图片;若不为灰度图,即彩色图,则采用cvtColor()函数进行色彩空间的转换。

def show(img):
    if img.ndim == 2:
        plt.imshow(img, cmap='gray')
    else:
        plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    plt.show()
# 读取彩色图
img = cv.imread('pic/bear500x333.jpg')
# print(img)
show(img)

 

# 读取灰度图
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
show(img_gray)

 

如图,已经将彩色图进行灰度处理。 

# 二值化图像
_, img_bin = cv.threshold(img_gray, 150, 255, cv.THRESH_BINARY)
show(img_bin)

 如图,将灰度图二值化处理,其中设定的值为150和255。该函数根据原图像的像素点分布占比对图像根据设定的值进行二值化。

# 保存图像
cv.imwrite('pic/apple_gray.jpg', img_gray)
cv.imwrite('pic/apple_bin.jpg', img_bin)

3、通道分离与合并 

 该部分涉及到cv库中的split()函数,该函数用于将多通道图像分离成单通道图像,即将三通道的彩色图分离成三个单通道的纯色图。

# 分离BGR通道

# r = img[:,:,0]
b, g, r = cv.split(img)
# b.shape
#show(b)
#show(g)
show(r)

 

如图,从左到右依次为b,g,r对应的单通道图像。倘若我们将b,g,r重新合并,则可将图像还原为原彩色图。

# 合并BGR通道
img_new = cv.merge([b, g, r])
show(img_new)

 

 此外,还可将原彩色图中的r,g,b三个色彩通道按自定义的权重进行重新调整,将其转化为灰度图。如下所示:

# rgb转灰度图
img_gray2 = 0.114*b + 0.587*g + 0.299*r
# img_gray2 = (0.299*r + 0.587*g + 0.114*b).astype(np.uint8)
show(img_gray2)

 

三、图像运算

该部分主要涉及图像的加减乘除处理。 

bg = cv.imread('D:\\proclass\\class\\pic\\background.jpg', 0)
ob = cv.imread('D:\\proclass\\class\\pic\\computer500x500.jpg', 0)
show(np.hstack([bg, ob]))

 

注:将两个图像用hstack()函数实现水平方向的拼接,但要求两个图像的维度必须一致。 具体可用shape()函数对图像的维度进行检查。

# 图像相加
# img_add = cv.add(bg*0.5, ob*0.5)
img_add = bg * 0.5 + ob * 0.5
show(img_add)

将两张图片按定义的权重进行相加处理,也可采用cv中的add()函数。 相加主要用于混合图像和添加噪声。

# 图像相减
# img_sub = img_add - bg * 0.5
img_sub = cv.subtract(img_add, bg * 0.5)
show(img_sub)

 

同理,对两张图像进行相减操作。 用来消除背景或者比较差异。

# 图像相乘
mask = cv.imread('D:\\proclass\\class\\pic\\mask500x500.jpg', 0)
# mask /= 255
# show(mask)
show(np.hstack([ob, mask]))
img_mul = cv.multiply(ob/1.0, mask/255)
show(img_mul)

 

 进行相乘处理,用来遮挡图像。

# 图像相除

ob_noise = cv.imread('D:\\proclass\\class\\pic\\hedgehog_noise_500x500.jpg', 0)
show(np.hstack([ob, ob_noise]))
img_div = cv.divide(ob, ob_noise+1)
show(img_div)

 

 其中,ob_noise为带噪声的图像,用来比较两张图中的差异。

 四、实例

第一步,读入图片。

bg = cv.imread('pic/petal500x500.jpg')
ob = cv.imread('pic/hedgehog500x500.jpg')
mask = cv.imread('pic/mask500x500.jpg')

show(np.hstack([bg, ob, mask]))

  

 第二步,用mask对第二张图片进行遮挡。

ob_select = np.float32(ob/1.0) * np.float32(mask/255.0)
show(np.uint8(ob_select))

 

 第三步,将mask图像的周围区域进行边缘处理,并用第一张图像对黑洞周围的区域进行填充。

bg_select = np.float32(bg/1.0) * np.float32(1-mask/255.0)
show(np.uint8(bg_select))

 

 第四步,将第二步处理后的图像与第三步处理后的图像按指定权重相加。从而实现图像的混合。

nice = cv.add(ob_select*0.8, bg_select).astype(np.uint8)
show(nice)

 

 

 

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

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

相关文章

什么是时间复杂度?

时间复杂度定义:在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的…

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

1、希尔排序 希尔排序(shell sort)是一种分组插入排序算法首先取一个整数d1n/2,将元素分为d1个组,每组相邻两元素之间距离为d1,在各组内进行直接插入排序取第二个整数d2d1/2,重复上述分组排序过程&#xf…

SpringCloud Alibaba Seata 工作机制

SpringCloud Alibaba Seata Seata 工作机制 说明 之所以放在后面说工作机制是因为如果一开始就说的话理解困难 所以我们有了前面的列子和说明我们在结合本节内容会收获的多理解相对容易点 分布式事务过程分析 Seata 分布式事务处理过程-ID三组件模型 debug 梳理: 术语 先…

C++ deque类成员函数介绍

目录 🤔deque模板介绍: 🤔deque特点: 🤔deque内存结构图解: 🤔deque各操作地址指向: 🤔 deque的成员函数: deque构造函数: 🔍代…

C++ 常见集合算法

目录 🤔常见集合算法: 🙂1.set_intersection 容器交集 代码示例: 运行结果: 🙂2.set_union 容器并集 图解: 代码示例: 运行结果: 🙂 3.set_differe…

高速缓存(cache)的原理: 了解计算机架构与性能优化

计基之存储器层次结构 Author: Once Day Date: 2023年5月9日 长路漫漫,而今才刚刚启程! 本内容收集整理于《深入理解计算机系统》一书。 参看文档: 捋一捋Cache - 知乎 (zhihu.com)iCache和dCache一致性 - 知乎 (zhihu.com)C…

【SpringCloud——Elasticsearch(上)】

一、什么是Elasticsearch elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。 二、倒排索引 1、正向索引 2、倒排索引 3、总结 三、ES和MySQL的区别 四、操作索引库 1、基于Kibana(WEB界面) 以下操作…

jvisualvm ssl远程连接JVM

jvisualvm 远程ssl连接 一、没认证的 JMX连接 (不安全) 这种方式,仅限于测试环境,可以这样操作。生产环境为了安全起见,还是要使用带认证的方式连接。 远程jar包服务 启动时 java -jar [jvm参数] xx.jar添加JVM参数 java -jar -Xmx512M -Xms2…

基于深度学习的高精度汽车自行车检测识别系统(PyTorch+Pyside6+模型)

摘要:基于深度学习的高精度汽车自行车检测识别系统可用于日常生活中检测与定位汽车自行车目标,利用深度学习算法可实现图片、视频、摄像头等方式的汽车自行车目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目…

基于深度学习的高精度野生动物检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度野生动物检测(水牛、犀牛、斑马和大象)识别系统可用于日常生活中或野外来检测与定位野生动物目标,利用深度学习算法可实现图片、视频、摄像头等方式的野生动物目标检测识别,另外支持结果可视…

Flutter问题记录 - TextField组件多行提示文本显示不全

文章目录 前言开发环境问题描述问题分析解决方案最后 前言 梳理Flutter项目的过程中发现还有一些遗留的TODO没处理,其中有一个和TextField组件相关。 开发环境 Flutter: 3.10.1Dart: 3.0.1 问题描述 TextField组件设置maxLines: null不限制行数,同时…

【文章学习系列之模型】SCALEFORMER

本章内容 文章概况模型结构主要方法多尺度框架跨尺度标准化模型输入编码损失函数 实验结果消融实验跨尺度标准化自适应损失函数 总结 文章概况 《SCALEFORMER: ITERATIVE MULTI-SCALE REFINING TRANSFORMERS FOR TIME SERIES FORECASTING》是2023年发表于ICLR上的一篇论文。作…

硬件工程师-BUCK开关电源设计

一、电感的伏安特性 电感线圈通电之后,会产生磁场,磁场是有一定极性的,而且磁场分布,是一个封闭的回路。在线圈的内部磁力线是比较密集的,磁场的强度是比较强的,外面空气中的的这个磁力线是比较稀疏的&…

【Unity3D】调整屏幕亮度、饱和度、对比度

1 屏幕后处理流程 调整屏幕亮度、饱和度、对比度,需要使用到屏幕后处理技术。因此,本文将先介绍屏幕后处理流程,再介绍调整屏幕亮度、饱和度、对比度的实现。 屏幕后处理即:渲染完所有对象后,得到一张屏幕图像&#xf…

Centos6.5环境Nginx 1.16.1升级到1.24.0版本

一、背景 2023年4月11日,官方发布了Nginx最新稳定版,版本号为 1.24.0。该版本是基于1.23.x(1.23.0 - 1.23.4)开发版的Bug修复,以及一些新特性的加入,而形成的稳定版。安全部门扫描后,发现现场不…

车载ECU休眠唤醒-TJA1145

前言 首先,请教大家几个小小问题,你清楚: 什么是TJA1145吗?你知道休眠唤醒控制基本逻辑是怎么样的吗?TJA1145又是如何控制ECU进行休眠唤醒的呢?使用TJA1145时有哪些注意事项呢? 今天&#xff…

chatgpt赋能python:Python中如何输入中文——从安装到常见问题解决

Python中如何输入中文——从安装到常见问题解决 Python是一门广泛使用的编程语言,其优秀的开源性、易用性、灵活性以及庞大的生态圈也令越来越多的人选择Python。但是对于初学者来说,如何正确输入中文常常成为一个问题。本篇文章从安装、常见问题解决、…

LeetCode 560 和为 K 的子数组

LeetCode 560 和为 K 的子数组 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/subarray-sum-equals-k/description 博主Github:https://github.com/GDUT-Rp/LeetCode 题目: 给你一个整数数组 …

ChatGPT的4个不为人知却非常实用的小功能

今天重点介绍四个ChatGPT很实用的小功能。 一、停止生成 如果在ChatGPT输出内容的过程中,我们发现结果不是自己想要的,可以直接点击“Stop generating”按钮,这样它就会立即停止输出。 二、复制功能 在ChatGPT返回对话的右侧,有三…

在vue中集成高德地图amap-jsapi-loader

前往高德地图开发平台高德开放平台 | 高德地图API 一:申请高德key 去高德官网去创建一个属于自己的地图应用 (得到key和秘钥) 。 首先,我们要注册一个开发者账号,根据实际情况填写,身份写个人:…