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

news/2024/7/21 7:14:08 标签: 图像处理, 人工智能

🚀写在前面🚀

🖊个人主页: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.niftyadmin.cn/n/377739.html

相关文章

数电/数字电子技术期末考前突击复习(小白稳过,看这一篇就够了)

博主:命运之光 专栏:期末考试必过and不挂科and争高分😶‍🌫️还有其他科目的考试突击日后会陆续更新 ✨✨✨✨✨点赞,关注,收藏不迷路✨✨✨✨✨ 🦄前言:总结了期末数电大概率可能…

分享一块很有意思的C代码(五),谈谈static变量在裸机轮询系统中的用法【原创】

文章目录 静态局部变量静态全局变量、静态局部变量、全局变量、局部变量区别谈谈static变量在裸机轮询系统中的用法如何用static局部变量实现非static全局变量的功能?错误方式静态局部变量 (1) 静态局部变量在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变…

网站使用高防cdn服务器有什么优势?

使用高防CDN(Content Delivery Network)服务器有以下几个优势: 1. 分布式负载均衡: 高防CDN服务器通过将内容缓存到全球分布的边缘节点上,可以将负载分散到多个服务器上。这样可以减轻源服务器的压力,并提高网站的整体性能和可用性…

02- python进程中的数据交互(Windows系统)

要点: multiprocessing 进程间信息交互 一 方法汇总 在 Python 进程中,有几种方法可以实现数据交互: 共享内存:这是一种用于进程间通信的高效方式。多个进程可以访问同一个共享内存区域,并在其中读取和写入数据。 管…

2023/5/30总结

CSS 滤镜: filter: 属性blur,模糊处理,数值越大越模糊。用来处理图片。 calc函数 对于css的块元素,可以用calc函数来计算:比如如果需要写父盒子宽度的一半再减去30px。可以写成width:calc(50%-30px),可…

FTP爆破攻击:使用Python脚本快速测试FTP服务器的安全性

部分数据来源:ChatGPT 引言 FTP是一个网络协议,用于在不安全的网络中传输文件。由于FTP协议的认证过程不安全,因此很容易受到攻击。破解FTP密码是黑客们最常用的攻击方法之一。但是,我们也可以使用相同的技术来测试自己的FTP服务器的安全性,并采取措施加强安全性。 本文…

Maven jar 包下载失败问题处理【配置Maven国内源】

前言 很多同学在Maven里下载一些依赖的时候,即下载【jar 包】的时候总是会出现一些问题,这里专门做一个教程讲解一下 其实这和你的Maven配置是有关系的,因为Maven是一个国际站点,它的仓库是在国外的,所以我们有时候在下…

chatgpt赋能python:Python中构造函数的作用

Python中构造函数的作用 Python是一种高级编程语言,其强大的面向对象编程(OOP)功能是其流行的主要原因之一。在Python中,通过使用构造函数可以轻松创建对象实例,并为对象的属性赋值。在本文中,我们将介绍P…