OpenCv入门2

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()#新建画图窗口

详见figure的使用

p1=plt.subplot(121)#将窗口分为一行两列,这里是第一列的子图
p2=plt.subplot(122)

详见subplot的使用

p1.plot(hist)#显示值方图

详见Matplotlib库学习(一)plt.plot
结果

在这里插入图片描述

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表示宽和高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值