Python百日百行代码挑战-day12,opencv笔记(二)

图像操作基础

图像相加和图像融合的那些爱恨情仇

图像相加就是单纯地相加,可以理解为就是两张图片的矩阵,对应位置的元素的相加,但是相加又出现了另一个问题,结果是多少?
首先,我们要明确一点就是图像是以二进制的形式保存在矩阵当中的,取得值是从0000 0000 – 1111 1111,对应的十进制就是0 – 255,因此得到的结果有两种

  • 直接相加,超过255的话和255进行取模运算,例如你得到了256,就变成了1
  • 饱和相加,超过255的值直接变成255,不在进行取余

下面直接看代码吧,明显一些

imgn5 = img5+img5   #  直接相加的方法
imgc5 = cv2.add(img5,img5)    #  饱和相加的方法
cv2.imshow("numpy",imgn5)
cv2.imshow("opencv",imgc5)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述
这个结果可以看到很明显啊,亮的那个就是把值取到了255的饱和相加的方法。(这叼毛软件居然会有水印,md再也不用了)

图像融合这玩意那就不一样了啊,相加是单纯地相加,融合是要将图片以不同的比例相加起来,用到了一个公式

r e s = i m g 1 ⋅ α + i m g 2 ⋅ β + γ res=img1\cdot\alpha+img2\cdot\beta+\gamma res=img1α+img2β+γ
最后面那个参数是亮度调节值,不能省略,不希望调暗或者调亮就写0。剩下的部分很好理解,就是用图像1的一部分和图像2的一部分相加,这里的一部分说的是值的一部分,而不是从矩阵当中截取了某一部分。
用到的函数是:cv2.addWeighted(img1,alpha,img2,beta,gamma)
代码如下:

res1 = cv2.addWeighted(img5,0.5,img6,0.6,0)  # 融合用这个函数
cv2.imshow("res",res1)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
可以很明显看到这就是两张图片稍微结合了一下。

图像类型的转换

日常工作中,经常会碰到一个问题就是我想把彩色图变成灰度图(毕竟原始的图像要三个通道,处理起来很麻烦的)。
因此这里记录一下类型转换,用法如下:

cv2.cvtColor(img,type)

其中img就是你要操作的图像,type就是你想转换的类型,上我的演示代码

img51 = cv2.cvtColor(img5,cv2.COLOR_BGR2GRAY)
img52 = cv2.cvtColor(img5,cv2.COLOR_BGR2RGB)
cv2.imshow("gray",img51)
cv2.imshow("rgb",img52)
cv2.waitKey(0)
cv2.destroyAllWindows()

第一个把彩色图转为灰度图,第二个把BGR图转为RGB图
在这里插入图片描述
在这里插入图片描述

图像几何操作

图像缩放

图像缩放可以放大和放小,有时候图片尺寸不一致,无法放到同一个网络中进行调试,因此我们需要将图像的大小设定为一致的,这时候就需要图像的缩放操作,用法如下:

cv2.resize(img,(x,y))
cv2.resize(img,(a*x,b*y))
cv2.resize(img,None,fx=a,fy=b)

第一个是直接指定修改的大小,指定修改完成之后是多少像素的图像
第二个是按乘数因子来放大和缩小图像
第三个是按倍数缩放图像,令其行是多少倍,列是多少倍,注意参数设定,这里有个None,代表第一个介绍的里面那个size是None,不指定任何值

rows,cols,chnn = img5.shape
img51 = cv2.resize(img5,(200,100))
img52 = cv2.resize(img5,(round(rows*0.5),round(cols*0.7)))
img53 = cv2.resize(img5,None,fx=0.5,fy=1.1)
cv2.imshow("img51",img51)
cv2.imshow("img52",img52)
cv2.imshow("img53",img53)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:
在这里插入图片描述
这个是直接指定缩放的大小
在这里插入图片描述
原来的行数和列数乘某个因子的结果,我后悔了,我应该按行来放大,这么一放大显得很冗杂,博客不美观了
在这里插入图片描述
这个就是直接缩放行和列的结果

图像旋转

这个东西在我之前想看某个动画的时候用过,当时那个图片就是各种反转什么的,我就操作了一下。函数很简单

cv.flip(img,value)

value有三种情况,等于0,小于0,大于0
等于0的时候是是按x轴进行旋转,大于0的时候是按y轴进行旋转,小于0的时候是水平+垂直方向进行旋转

img51 = cv2.flip(img5,0)
img52 = cv2.flip(img5,1)
img53 = cv2.flip(img5,-1)
cv2.imshow("img5",img5)
cv2.imshow("img51",img51)
cv2.imshow("img52",img52)
cv2.imshow("img53",img53)
cv2.waitKey(0)
cv2.destroyAllWindows()

我感觉这个结果是图片,太大了一点,就不放了,仅记录一下函数即可

阈值分割

首先说一下基础理论部分
在这里插入图片描述
这是opencv官网上面的一张图,这里对这张图做一下解释。
首先第一张图是原信号。其中红线部分是阈值
在这里插入图片描述

二值化阈值

在这里插入图片描述
r e s = { 255 , x ≤ t h e r s h o l d 0 , x > t h r e s h o l d (1) res= \begin{cases} 255,\quad x \leq thershold \\ 0,\quad x \gt threshold \end{cases} \tag{1} res={255,xthershold0,x>threshold(1)
小于某个值就令其为0,大于某个值就令其取得最大值,不过图像里面一般都是255

反二进制阈值

在这里插入图片描述
r e s = { 0 , x ≤ t h e r s h o l d 255 , x > t h r e s h o l d (2) res= \begin{cases} 0,\quad x \leq thershold \\ 255,\quad x \gt threshold \end{cases} \tag{2} res={0,xthershold255,x>threshold(2)
刚好反了

截断阈值处理

在这里插入图片描述
r e s = { x , x ≤ t h e r s h o l d t h r e s h o l d , x > t h r e s h o l d (3) res= \begin{cases} x,\quad x \leq thershold \\ threshold,\quad x \gt threshold \end{cases} \tag{3} res={x,xthersholdthreshold,x>threshold(3)

反向阈值化为0

在这里插入图片描述
r e s = { x , x ≤ t h e r s h o l d 0 , x > t h r e s h o l d (4) res= \begin{cases} x,\quad x \leq thershold \\ 0,\quad x \gt threshold \end{cases} \tag{4} res={x,xthershold0,x>threshold(4)

阈值0化

在这里插入图片描述
r e s = { 0 , x ≤ t h e r s h o l d x , x > t h r e s h o l d (5) res= \begin{cases} 0,\quad x \leq thershold \\ x,\quad x \gt threshold \end{cases} \tag{5} res={0,xthersholdx,x>threshold(5)

用到的函数是

a,b = cv2.threshold(img,threshold,maxvalue,type)

其中a是阈值,就是赋值的时候写的那个threshold。b是处理过后的图像。
img是你要处理的图片
threshold是你设定的阈值
maxvalue是最大值
type是处理类型,具体如下:

cv2.THRESH_BINARY  二值化阈值
cv2.THRESH_BINARY_INV  反二进制阈值
cv2.THRESH_TRUNC  截断阈值处理
cv2.THRESH_TOZERO_INV  反向阈值化为0
cv2.THRESH_TRUNC  阈值0化

实例

a1,b1 = cv2.threshold(img3,127,255,cv2.THRESH_BINARY)   
a2,b2 = cv2.threshold(img3,127,255,cv2.THRESH_BINARY_INV)
a3,b3 = cv2.threshold(img3,127,255,cv2.THRESH_TRUNC)
a4,b4 = cv2.threshold(img3,127,255,cv2.THRESH_TOZERO_INV)
a5,b5 = cv2.threshold(img3,127,255,cv2.THRESH_TRUNC)
cv2.imshow("b1",b1)
cv2.imshow("b2",b2)
cv2.imshow("b3",b3)
cv2.imshow("b4",b4)
cv2.imshow("b5",b5)
cv2.waitKey(0)
cv2.destroyAllWindows()

处理的是指纹图像,结果太占地方了就不放了。

防火防盗防诈骗

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值