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

🚀写在前面🚀

🖊个人主页: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://xiahunao.cn/news/253908.html

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

相关文章

【流放之路-poe的使用攻略】

打开国服市集 添加自己的poe 第一步:查看自己的名字 开打地址 第一步:查看自己的代码 F12 导入后就会出现自己的poe

【流放之路-第六章】

从狮眼守望到绝望岩滩杀boss回城去目光海滩 从目光海滩去海潮孤岛 从海潮孤岛拿任务道具后去目光海滩 从目光海滩去炙热盐沼 从炙热盐沼去卡鲁要塞 从卡鲁要塞去图克哈玛的要塞打boss去下图3到寂默山岭 从寂默山岭到禁灵之狱下层 从禁灵之狱下层到薛朗之塔 从薛朗之塔到…

可以测试流放之路伤害的软件,流放之路:游戏难点!你知道平均每秒伤害(DPS)怎么计算吗!...

近来有很多朋友在入坑POE一定时间后,都提出了关于DPS如何计算的问题。 这个问题,牵扯面比较多。所以不太好讲解,我在下述的叙述里,会穿插一些以往发过的科普贴,请结合起来一起看。 老实说这块儿是很难,不是真心想研究它,是很难看进去的。想研究,就请耐下心来一点点看。…

可以测试流放之路伤害的软件,测试平台及细节一览 - 《流放之路》国服硬件需求测试:低配也能续写ARPG传奇 - 超能网...

测试平台、场景说明 测试平台 测试平台配置主要分为两套,第一套配置为Skylake平台基础搭建的ASUS MAXIMUS VIII GEN(Z170)主板,处理器为Intel Core i7-6700K,内存是G.Skill Ripjaws V 4GB DDR4 3200x2组成的双通道;第二套配置为Kaveri平台(APU)基础搭建的MSI A88XM GAMING(…

卫士处刑者冠军css3边,流放之路决斗者冠军双持刀刃乱舞BD分享

关于决斗者的冠军升华,目前来说,是比较冷门的,流行的冠军BD也比较少见,主要是因为这个升华带来的永驻护体(全域20%减伤)虽然看似强大,却难以找到很好的配合效果,而且其他升华点也相对较弱,因此相…

可以测试流放之路伤害的软件,《流放之路》增伤机制介绍 伤害怎么计算

导 读 《流放之路》伤害怎么计算你清楚吗?在计算整体伤害的时候都要注意哪些细节呢?很家对此不是很清楚,接下来就跟随小编一起来了解下《流放之路》增伤机制介绍吧,感兴趣的小伙伴快来围观一下吧! 一、增伤的计... 《流放之路》伤害怎么计算你清楚吗?在计算整体伤害的时候…

流放之路+连接服务器+未响应,流放之路链接服务器中就未响应

流放之路链接服务器中就未响应 内容精选 换一换 使用configure命令配置构建。它定义了系统的各个方面,包括允许nginx用于连接处理的方法。最后,它会创建一个Makefile。该configure命令支持以下参数:--help打印帮助信息。--prefixpath定义将保…

流放之路服务器维护,流放之路专属私享服务器详细介绍

流放之路在周年赛季中暗黑之父将会为大家架设带有独特MOD的服务器,那么对于这条专属的私享服务器玩家们怎么参加呢?下面小编就为大家带来了详细的介绍,感兴趣的玩家一起来看看吧。 专属私享服务器介绍 在《流放之路》“至暗地心”周年赛季即将…

何时加索引,性别字段和逻辑删除字段应不应该加

首先哪些地方加索引(按照sql执行顺序写) 1、from表扫描连接处索引 2、where后条件去走索引 3、group by加索引 4、select查询不用加 5、order by排序加索引 (对于第四点,覆盖索引:查询的字段都被索引覆盖,…

登录图形验证码验证

1.页面添加 一个验证码输入框 一个img标签用来存放验证码图 写一个imgCode()点击事件,用来刷新验证码 将获得的验证码放入redis缓存当中,登录的时候用来验证 验证图形验证码是否正确 代码如下: controller层: RequestMapping("toLogin")pu…

java实现图形验证码

项目中可能会用到图形验证码的功能,源码分享给大家。以下是实际效果图: 一、后端JAVA代码 1.生成图形验证码工具类 public class imgVerifyCode {private int weight 100; //验证码图片的长和宽private int height 40;private String te…

PHP生成图形验证码

PHP生成图形验证码 效果:随机生成6位验证码,100个干扰的黑点,一条干扰线 代码:image.php(生成验证码)和check.php(验证验证码是否输入正确) 效果图详见代码下面的截图 image.php &l…

图形验证码验证

图形验证码一般是防止恶意,人眼看起来都费劲,何况是机器。不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片, 图片里加上…

gin集成图形验证码

简介 github 文档 生成图形验证码 package mainimport ("github.com/gin-gonic/gin""github.com/mojocn/base64Captcha""net/http" )var store base64Captcha.DefaultMemStorefunc main() {r : gin.Default()group : r.Group("/captcha…

SpringBoot生成图形验证码

需求:验证码一码一用,验证之后,不管是成功还是失败,都需要重新获取或者刷新二维码。 大致思路:后端生成验证码后还需要生成一个UUID与之对应,存储到缓存(记得添加过期时间)&#xf…

自己实现图形验证码

如果不想重复造轮子,参考上一篇文章:SpringBoot生成图形验证码_Muscleheng的博客-CSDN博客 这里不需要依赖开源组件包,完全自己实现图形验证码功能 两步完成: 第一步:编写图形验证码工具 package com.zhh.demo.com…

图形验证码的使用

在用户登录的时候,除了要输入用户名和密码,有时候还需要输入验证码进行验证,如下: 现在一般用短信验证码比较多,但是图形验证码也有使用。记录一下图形验证码的使用过程。 1、验证码生成器 先定义一个验证码的生成器…

vue图形验证码

Vue图形验证码 组件 可以自行封装一下&#xff0c;放在components目录下。 <template><span class"s-canvas" click"changeCode"><canvas id"s-canvas" :width"contentWidth" :height"contentHeight">…

图形验证码安全

目录 图形验证码 图形验证码的作用和原理 图形验证码的分类 图形验证码的验证过程 图形验证码的安全问题 静态图形验证码的破解 利用Python脚本破解静态图形验证码 图形验证码 我们经常在登录app或者网页的时候&#xff0c;都会需要我们输入图形验证码上的内容&#xf…

图形验证码

一、图形验证码是什么&#xff1f; 图形验证码是一些没有规则的图文的组合&#xff0c;参考下图 二、图形验证码有什么用&#xff1f; 防止恶意攻击者采用恶意工具批量注册账号或是大量频繁调用某些请求&#xff0c;给服务器造成压力&#xff0c;占用大量的系统资源。 三、图形…