python-opencv库的基本使用

549 阅读4分钟

myplot.png

图片叠加


import cv2
from matplotlib import pyplot as plt
import numpy as np
import time
import random

img1 = cv2.imread("D:/pythonProject/venv/okk.jpg",cv2.IMREAD_COLOR)
img2 = cv2.imread("D:/pythonProject/venv/kangna.jpg",cv2.IMREAD_COLOR)
# img3 = cv2.imread("D:/计算机视觉作业/images/lenna.jpg",cv2.IMREAD_COLOR)
# img1 = cv2.imread("D:/计算机视觉作业/images/hill.jpg",cv2.IMREAD_COLOR)
# img2 = cv2.imread("D:/计算机视觉作业/images/flower1.jpg",cv2.IMREAD_COLOR)
# img3 = cv2.imread("D:/计算机视觉作业/images/lenna.jpg",cv2.IMREAD_COLOR)
# # cv2.imshow('image',~image)
# wei = cv2.addWeighted(img1,0.3,img2,0.7,0)


c_2 = cv2.resize(img2,(700,500))
c_1 = cv2.resize(img1,(700,500))
# c_3 = cv2.resize(img3,(700,500))
# c_2 = cv2.resize(img2,(500,500))
# c_1 = cv2.resize(img1,(500,500))
# c_3 = cv2.resize(img3,(500,500))
wei = cv2.addWeighted(c_2,0.8,c_1,0.25,-25)#最后一个是伽马值,光的测量值,其实就是曝光度,越大越亮
# cv2.imshow("c",c_2)
# cv2.imshow("cc",c_1)
# cv2.imshow("1",c_1)
# cv2.imshow("2",~c_1)
# imgs = np.hstack([img1,img2,img3])
# cv2.imshow("shjdj",imgs)
cv2.imshow("A",wei)
# filename = 'D:/pythonProject/venv/cv2.jpg'

# cv2.imwrite(filename,wei)
cv2.waitKey(0)
cv2.destroyAllWindows()

#以上是叠加图片

第一个是cv2.addWeighted()函数的使用,0.8,0.25指的是权重,最后一个是伽马值,光的测量值,其实就是曝光度,越大越亮,效果如下

kangna.jpg

okk.jpg

cv2.jpg

img1 = cv2.imread('cv2.jpg')
img = cv2.imread('20220924.png')
#I want to put logo on top-left corner, So I create a ROI
img2 = cv2.resize(img,(400,300))

rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]
#Now create a mask of logo and create its inverse mask
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
img2gray = ~img2gray
# add a threshold
ret,mask = cv2.threshold(img2gray, 180, 255, cv2.THRESH_BINARY_INV)
mask_inv = cv2.bitwise_not(mask)
# Now black-out the area of logo in ROI
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
# Take only region of logo from logo image.
img2_fg = cv2.bitwise_and(img2, img2, mask=mask)
dst = cv2.add(img1_bg,img2_fg)
img1[0:rows, 0:cols] = dst
cv2.imshow('res',img1)

cv2.waitKey(0)
cv2.destroyAllWindows()

将一张图片加到另一张图片的左上角,效果如下:

cv2plus.jpg

二值化处理

#二值化处理
img = cv2.imread("7364.png",cv2.IMREAD_GRAYSCALE)
max_output_value = 255 #用于确定输出像素的最大强度
neighborhood_size = 119#越小越密集
subtract_from_mean = 1#好像越大越亮
# img_hui = cv2.equalizeHist(img)
img_brinaryize = cv2.adaptiveThreshold(img,max_output_value,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,neighborhood_size,subtract_from_mean)
#参数 cv2.ADAPTIVE_THRESH_GAUSSIAN_C 将像素的阈值设置为相邻像素强度的加权和,其权重由高斯窗口确定。
#参数 neighborhood_size 块大小(用于确定像素阈值的邻域大小)
#参数 subtract_from_mean 一个用来手动调整阈值的常数(从计算出的阈值中减去该常数)

cv2.imshow("yes",img_brinaryize)
cv2.imwrite("7364二值化.png",img_brinaryize)
cv2.waitKey(0)
cv2.destroyAllWindows()

二值化处理,就是将图片变成黑白图片,阈值法是指选取一个数字,大于它就视为全白,小于它就视为全黑,当然二值化方法还有很多,像局部光照处理,用的是局部阈值法等等。本次实验效果如下

image.png

image.png

图片平滑(模糊处理)

#平滑 使图片模糊

frame = cv2.imread("7364.png",cv2.IMREAD_COLOR)
frame = cv2.resize(frame,(600,600))
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# lower_red = np.array([30, 150, 50])#R G B g越小显示的越多
# upper_red = np.array([255, 255, 180]) #BLUE,最后一个数字越大越亮,
#red 越大红色显示的越多,通道数
lower_red = np.array([0, 0, 0])#R G B g越小显示的越多
upper_red = np.array([255, 255, 255]) #BLUE,最后一个数字越大越亮,red 越大红色显示的越多,通道数
mask = cv2.inRange(hsv, lower_red, upper_red)
res = cv2.bitwise_and(frame,frame, mask= mask)
# cv2.imshow('frame',frame)
# cv2.imshow('mask',mask)
# cv2.imshow('res',res)

kernel = np.ones((15,15),np.float32)/225
smoothed = cv2.filter2D(res,-1,kernel)
cv2.imshow('Original',frame)
cv2.imshow('Averaging',smoothed)

blur = cv2.GaussianBlur(res, (15, 15), 0)
cv2.imshow('Gaussian Blurring', blur) #高斯模糊,更清晰
median = cv2.medianBlur(res, 15)
cv2.imshow('Median Blur', median)#中值模糊,忽略的像素值比较多
bilateral = cv2.bilateralFilter(res,15,75,75)
cv2.imshow('bilateral Blur',bilateral)  #双向模糊,最清晰


cv2.waitKey(0)
cv2.destroyAllWindows()

第一个平滑方法是计算每个像素块的均值,然后还有高斯模糊,中值模糊,双向模糊等等已经包装好的函数,算法不再赘述,效果如下:

image.png

消除图像噪音

frame = cv2.imread("0A8C_1664433753.png",cv2.IMREAD_COLOR)
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# lower_red = np.array([30,150,50])
# upper_red = np.array([255,255,180])
lower_red = np.array([30,30,50])
upper_red = np.array([255,255,180])
mask = cv2.inRange(hsv, lower_red, upper_red)
res = cv2.bitwise_and(frame,frame, mask= mask)
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
cv2.imshow('Original',frame)
cv2.imshow('Mask',mask)
cv2.imshow('Opening',opening)
cv2.imshow('Closing',closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

我们取像素周围的一小部分邻居,做一些类似于高斯平均权重,中值等替换掉中间的元素,效果如下:

image.png

image.png

image.png

image.png

颜色图中值滤波

img01 = cv2.imread("0A8C_1664433753.png")
# cv2.imshow("chushi",img01)
# img_medianBlur=cv2.medianBlur(img01,3) # 中值滤波
# cv2.imshow("result",img_medianBlur)    # 显示中值滤波结果

dst = cv2.fastNlMeansDenoisingColored(img01, None, 10, 10, 7, 21)

plt.subplot(121), plt.imshow(img01)
plt.subplot(122), plt.imshow(dst)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

这个主要是fastNlMeansDenoisingColored()函数, fastNlMeansDenoisingColored(src, dst=None, h=None, hColor=None, templateWindowSize=None, searchWindowSize=None) img:需要处理图像 (size,size):高斯核尺寸 sigmaX:X方向上的高斯核标准偏差 sigmaY:Y方向上的高斯核标准偏差;如果sigmaY为零,则将其设置为等于sigmaX;如果两个sigma都为零,则分别从ksize.width和ksize.height计算得出;为了完全控制结果,建议指定所有ksize,sigmaX和sigmaY

image.png

加入噪声

#读取图像
img=cv2.imread("nilu.jpg")
#获取图像属性
h, w = img.shape[0:2]
#加噪声
for i in range(3000):    #添加3000个噪声点
    x = np.random.randint(0, h)
    y = np.random.randint(0, w)
    img[x,y,:] = 255
#调用OpenCV库函数中的高斯滤波函数
result=cv2.GaussianBlur(img,(5,5),1,1) #传入读取的图像和核尺寸
cv2.imshow("src",img)
cv2.imshow("GaussianBlur-opencv",result)
cv2.waitKey(0)

image.png

高斯滤波对椒盐噪声的处理不是太好,因为高斯滤波的主要作用不是用来去除图像的椒盐噪声,而是消除图像的高斯噪声,我们通过调整高斯核大小,对图像进行模糊而不是模糊的过程中就将噪声给隐藏掉