opencv 教程2 画图操作 阈值操作 像素操作与或非 图像掩膜操作 图像融合

opencv 教程2 画图操作 阈值操作 像素操作与或非 图像掩膜操作 图像融合

1.画图操作:
1)画多边形

import  cv2 as cv
import  numpy as np
img=np.zeros((400,400,3))        #黑色背景
pts=np.array([[100,200],[200,250],[250,300],[300,380]])#各个顶点
cv.polylines(img,[pts],1,(0,255,0),thickness=3)#画图
cv.imshow("lines",img)
cv.waitKey(0)

results:在这里插入图片描述
2)写字

src=cv.imread('D:/731.png')
font=cv.FONT_HERSHEY_COMPLEX
cv.putText(src,'hello,python',(100,100),font,1,(0,255,0),5)
cv.imshow("wenzi",src)
cv.waitKey(0)

在这里插入图片描述
2.各种阈值操作
1)理解二值化
2)OTSU阈值
3)其他各种阈值操作

1)二值化理解:超过阈值为1,低于为0也就是黑色白色。
二值化例子:

import  cv2 as cv
import  numpy as np
src=cv.imread('D:/731.png')
gray=cv.cvtColor(src,cv.COLOR_BGR2GRAY)
ret,binary=cv.threshold(gray,177,255,cv.THRESH_BINARY)#设定一直为177超过177为1低于为0
cv.imshow('binary', binary)
cv.imshow('src',gray)
cv.waitKey(0)

在这里插入图片描述
2)OTSU阈值
和上面代码类似,不需要给阈值,计算机自动求取阈值

import  cv2 as cv
src=cv.imread('D:/731.png')
gray=cv.cvtColor(src,cv.COLOR_BGR2GRAY)
# ret,binary=cv.threshold(gray,177,255,cv.THRESH_BINARY)
ret,binary=cv.threshold(gray ,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)#otsu自动求取阈值只需要给最小值和最大值
cv.imshow('binary', binary)
cv.imshow('src',gray)
cv.waitKey(0)

result:
在这里插入图片描述
3) 其他各种阈值操作

import  cv2 as cv
import  numpy as np
from matplotlib import  pyplot as plt
src=cv.imread('D:/731.png')
img=np.uint8(np.arange(400*400*3).reshape(400,400,3)/(400*400*3)*255)#生成渐变背景,不会的童鞋可以复习下numpy
#1简单阈值
ret,thersh1=cv.threshold(img,127,255,cv.THRESH_BINARY)#简单阈值,前面已经操作过了
#2反二值化
ret,thersh2=cv.threshold(img,127,255,cv.THRESH_BINARY_INV)#阈值反二值化,也就是反过来,你懂的
#TRUNC操作
ret,thersh3=cv.threshold(img,127,255,cv.THRESH_TRUNC)#小于阈值颜色不变大于阈值为阈值的灰度值。看下面的图可以
#阈值取0 小于阈值像素点置0,大于阈值像素点保持原色
ret,thersh4=cv.threshold(img,127,255,cv.THRESH_TOZERO)
#阈值取0再取反(上面那个反过来)
ret,thersh5=cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)
title=['orignal image','binary image','binary_Inv IMAGE','TRUNC','TOZERO','tozero_inv']
image=[img,thersh1,thersh2,thersh3,thersh4,thersh5]
for i in range(len(image)):
    plt.subplot(2,3,i+1)
    plt.imshow(image[i],"gray")
    plt.title(title[i])
    plt.xticks([]),plt.yticks([])#轴清空
plt.show()

结果:
在这里插入图片描述
前面的操作都是在全图进行的阈值,那么这些有一定的局限性,例如一张左下角很亮右上角很暗的图片,那么此时对全图进行阈值操作就会有问题,所以接下来介绍局部阈值
3.自适应阈值:也叫局部二值化
局部二值化一定要做高斯滤波,不然噪点会使阈值效果变差

import cv2
import numpy as np

"#自适应阈值:局部二值化"
from matplotlib import pyplot as plt
img = cv2.imread('../images/6.jpg', 0)
# cv2.imshow("",img)
img = cv2.GaussianBlur(img, (5, 5), 0)
# cv2.imshow("",img)
# ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_OTSU)
th2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 9, 3)
th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 9, 3)


titles = ['Original Image', 'Global Thresholding (v = 127)',
'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]
for i in range(4):
    plt.subplot(2, 2, i + 1),
    plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.imshow(th3,"gray")
plt.show()
cv2.waitKey(0)

结果:
在这里插入图片描述
3.图像像素操作
异或

import  numpy as np
import  cv2 as cv
img1=cv.imread("d:/1.jpg")
img2=cv.imread('d:/7.jpg')
img_xor=cv.bitwise_xor(img1,img2)
cv.imshow('',img_xor)
cv.waitKey(0)

自己可以搞两张图片看看,就是与或非操作,懂得都懂~
4.掩膜操作

import  numpy as np
import  cv2 as cv
img1=cv.imread("d:/1.jpg")
img2=cv.imread('d:/7.jpg')
img2gray=cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret,mask=cv.threshold(img2gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
mask_inv=cv.bitwise_not(mask)
# # 利用掩膜(mask)进行“与”操作,即掩膜图像白色区域是对需要处理图像像素的保留,黑色区域是对需要处理图像像素的剔除。
img_bg=cv.bitwise_and(img1,img1,mask=mask_inv)#掩膜操作,img1与img1一起做与运算,但是有掩膜操作,黑字遮住了下部分
cv.imshow('',img_bg)
dst=cv.add(img_bg,img2)
cv.imshow('',dst)
cv.waitKey(0)

代码中的2张图:在这里插入图片描述
最后掩膜后的结果:
在这里插入图片描述
5.图像融合

import  numpy as np
import  cv2 as cv
img1=cv.imread("d:/1.jpg")
img2=cv.imread('d:/8.jpg')
img2=cv.resize(img2,(img1.shape[1],img1.shape[0]),interpolation=cv.INTER_LINEAR)
img3=cv.add(np.uint8(img1*0.5),np.uint8(img2*0.5))
cv.imshow('',img3)
cv.waitKey(0)

结果:在这里插入图片描述
累了累了老铁们,今天就写到这儿吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值