2.0Masking操作
主要函数为cv2.bitwise_and(image,image,Mask=Mask)前两个参数为原图,(也可不同,但尺寸大小得一样)。
代码
import cv2 as cv
import numpy as np
image=cv.imread('D:/picture/AAA.jpg')
#print(image.shape[0],image.shape[1])
(x,y)=(image.shape[0]//2,image.shape[1]//2)
mask=np.zeros(image.shape[:2],dtype='uint8')
cv.rectangle(mask,(x-120,y-10),(x+10,y+40),255,-1)
Masked=cv.bitwise_and(image,image,mask=mask)
cv.imshow("image",image)
cv.imshow("Masked",Masked)
cv.waitKey(0)
cv.destroyAllWindows()
注
cv.rectangle(mask,(x-120,y-10),(x+10,y+40),255,-1)
Masked=cv.bitwise_and(image,image,mask=mask)
做mask矩形,在与原图像做交集。
结果
2.1色彩通道分离与融合
分离主要使用split方法,融合则用merge方法。
代码
import cv2 as cv
import numpy as np
image=cv.imread('D:/picture/5.jpg')
(B,G,R)=cv.split(image)
imaged=cv.merge([B,G,R])
cv.imshow("Blue",B)
cv.imshow("Green",G)
cv.imshow("Red",R)
cv.imshow("imaged",imaged)
cv.waitKey(0)
cv.destroyAllWindows()
结果
2.2颜色空间转化
HSV空间表达比RGB表达更接近人类对色彩的感知,而Lab比HSV更好。
代码
import cv2 as cv
import numpy as np
image=cv.imread('D:/picture/5.jpg')
cv.imshow("image",image)
HSV=cv.cvtColor(image,cv.COLOR_BGR2HSV)
cv.imshow("HSV",HSV)
gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
cv.imshow("gray",gray)
lab=cv.cvtColor(image,cv.COLOR_BGR2LAB)
cv.imshow("L*a*b",lab)
cv.waitKey(0)
cv.destroyAllWindows()
注
H指的是色调,S是饱和度,V是明暗度,操作时可忽略图片三通道的性质,H的取值是[0,180],其他的通道取值是[0,255]。
结果
图像色调调整
代码
import cv2 as cv
image=cv.imread("D:/picture/2.jpg")
image_HSV=cv.cvtColor(image,cv.COLOR_BGR2HSV)
turn_image_HSV=image_HSV.copy()
turn_image_HSV[:,:,0]=(turn_image_HSV[:,:,0]-33)%180
turn_image=cv.cvtColor(turn_image_HSV,cv.COLOR_HSV2BGR)
#turn_image_HSV[:,:,0]=turn_image_HSV[:,:,0]*0.6
cv.imshow("turn_image_HSV",turn_image_HSV)
cv.imshow("turn_image",turn_image)
cv.imshow("image",image)
cv.waitKey(0)
cv.destroyAllWindows()
注
turn_image_HSV[:,:,0]=(turn_image_HSV[:,:,0]-33)%180
0指色调,1指饱和度,2是明暗度。每个像素点从整体色调中减去33个单位的色调。
图像色彩的随机变换
源码
import cv2 as cv
import numpy as np
image=cv.imread("D:/picture/1.jpg")
imageHSV=cv.cvtColor(image,cv.COLOR_BGR2HSV)
image_HSV=imageHSV.copy()
image_HSV[:,:,0]=(image_HSV[:,:,0] + np.random.random() )%180 #色调
image_HSV[:,:,1]=(image_HSV[:,:,1] + np.random.random() )%180 #饱和度
image_HSV[:,:,2]=(image_HSV[:,:,2] + np.random.random() )%180 #明暗度
OK_image=cv.cvtColor(image_HSV,cv.COLOR_HSV2BGR)
cv.imshow("end",OK_image)
cv.waitKey(0)
cv.destroyAllWindows()
结果
2.3颜色直方图
代码
import cv2 as cv
from matplotlib import pyplot as plt
image=cv.imread("D:/picture/5.jpg")
gray_image=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
hist=cv.calcHist([gray_image],[0],None,[256],[0,256])#创建直方图
plt.figure()#新建画图窗口
p1=plt.subplot(121)#将窗口分为一行两列,这里是第一列的子图
p2=plt.subplot(122)
p1.plot(hist)#显示值方图
chans=cv.split(image)#将图片进行色彩分离
colors=('b','g','r')
for(chan,color)in zip(chans,colors):
hist=cv.calcHist([chan],[0],None,[256],[0,256])
p2.plot(hist,color=color)
plt.show
注
hist=cv.calcHist([gray_image],[0],None,[256],[0,256])
详见图像直方图
plt.figure()#新建画图窗口
p1=plt.subplot(121)#将窗口分为一行两列,这里是第一列的子图
p2=plt.subplot(122)
p1.plot(hist)#显示值方图
2.4平滑与模糊
常用的平滑方法有cv2.blur(image,(3,3))(均值),cv2.GaussianBlur(image,(3,3),0)(高斯),cv2.medianBlur(image,5)(中值),cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)(双边).
代码
import cv2 as cv
import numpy as np
image=cv.imread("D:/picture/5.jpg")
blurred=np.hstack([cv.blur(image,(3,3)),cv.blur(image,(5,5)),cv.blur(image,(7,7))])
cv.imshow("Averaged",blurred)
blurred=np.hstack([cv.GaussianBlur(image,(3,3),0),cv.GaussianBlur(image,(5,5),0),cv.GaussianBlur(image,(7,7),0)])
cv.imshow("Gaussian",blurred)
blurred=np.hstack([cv.medianBlur(image,3),cv.medianBlur(image,5),cv.medianBlur(image,7)])
cv.imshow("Median",blurred)
blurred=np.hstack([cv.bilateralFilter(image,5,21,21),cv.bilateralFilter(image,7,31,31),cv.bilateralFilter(image,9,41,41)])
cv.waitKey(0)
cv.destroyAllWindows()
注
np.hstack
在水平方向上平铺堆叠数组构成一个新的数组。
详见:np.hstack()、np.vstack()函数解析
blurred=np.hstack([cv.blur(image,(3,3)),cv.blur(image,(5,5)),cv.blur(image,(7,7))])
详见:Python+opencv 图像模糊
cv.blur(image,(3,3))里面的(3.3)参数为卷积核,也可以称为感受野,注意是奇数,均值平滑会在感受野内做平均,感受野越大,平滑效果越好。
cv.GaussianBlur(image,(3,3),0)
高斯平滑使用高斯来求感受野中的像素值的期望。第三个参数0表示自动计算核大小。
cv.medianBlur(image,3)
中值对去除椒盐噪声十分有用,使用感受野中像素值的中位数。
cv.bilateralFilter(image,5,21,21)
双边平滑通过引入两个高斯分布,在去除噪声的同时保留了边缘信息,处理速度相对较慢。
详见:opencv入门10:平滑和模糊-SMOOTHING AND BLURRING
结果
2.5边缘检测
代码
import cv2 as cv
import numpy as np
image=cv.imread("D:/picture/AAA.jpg")
blured=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
blured=cv.GaussianBlur(blured,(5,5),0)#使用高斯平滑消除噪声
canny=cv.Canny(blured,40,120)
cv.imshow("canny",canny)
cv.imshow("image",image)
cv.waitKey(0)
cv.destroyAllWindows()
注
canny=cv.Canny(blured,40,120)
Canny算子,40为低阈值,120为高阈值。
详见:opencv学习笔记(二十三)Canny边缘检测cvCanny()
结果
2.6人脸和眼睛检测识别
代码
import cv2 as cv
def video_demo():
eye_cascade=cv.CascadeClassifier('C:/Users/13549/Downloads/opencv-master/data/haarcascades/haarcascade_eye.xml')#级联滤波器
faceCascade=cv.CascadeClassifier('C:/Users/13549/Downloads/opencv-master/data/haarcascades/haarcascade_frontalface_default.xml')#分类器接受XML文件地址参数
capture=cv.VideoCapture(0)
while True:
ret,frame=capture.read()
frame=cv.flip(frame,1)
print(frame.shape)
faces_rects=faceCascade.detectMultiScale(frame,scaleFactor=1.05,minNeighbors=5,minSize=(30,30),flags=cv.CASCADE_SCALE_IMAGE)
for(x,y,w,h) in faces_rects:
img=cv.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray=frame[y:y+h,x:x+w]
roi_color=img[y:y+h,x:x+w]
eyes=eye_cascade.detectMultiScale(roi_gray)
for(ex,ey,ew,eh) in eyes:
cv.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
cv.imshow("AAAA",frame)
if cv.waitKey(10) & 0xFF == ord('q'):
break
video_demo()
cv.destroyAllWindows()
注
faces_rects=faceCascade.detectMultiScale(frame,scaleFactor=1.05,minNeighbors=5,minSize=(30,30),flags=cv.CASCADE_SCALE_IMAGE)#
使用detectMultiScale方法进行目标检测,scaleFactor表示图片缩放比例,用于对图片进行多尺度金字塔创建,1.05表示在金字塔层逐层减小图片尺寸的5%;
minNeighbors表示滑窗内需要检测多少个矩形来确认有人脸;
minSize表示最小滑窗的大小,分类器不会考虑比这个值小的滑窗。
faces_rects表示有人脸的矩形框,表示为(x,y,w,h),x,y表示左上点坐标,w,h表示宽和高。