教程
图片加载和展示
- 读取图片和展示
src = cv.imread("C:/Users/cznczai/Desktop/Important_file/person1.jpg") 加载 def get_image_info(image): print(image.shape) print(image.size) print(type(image)) print(image.dtype) #(413, 295, 3) 高度 宽度 通道3个 #365505 413*295*3 #<class 'numpy.ndarray'>; n维数组形式 #uint8 无符号的8位 get_image_info(src) cv.namedWindow("image",cv.WINDOW_AUTOSIZE) cv.imshow("image",src) cv.waitKey(0) # ≤ 0,将无限期的等待下去;当delay=0时,就是等待delay毫秒 cv.destroyAllWindows()//关闭所有的窗口
- 图片转化为灰度图片 并且保存到本地的代码
src = cv.imread("C:/Users/cznczai/Desktop/Lena.jpg") cv.namedWindow("image",cv.WINDOW_AUTOSIZE) cv.imshow("image",src) gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY) cv.imwrite("C:/Users/cznczai/Desktop/Lena_gray.jpg",gray) cv.waitKey(0) cv.destroyAllWindows()
- 输入输出高度宽度通道数
def show_info(image): heigh = image.shape[0] width = image.shape[1] channel = image.shape[2] #heigh:200,width=200,channel=3 print("heigh:%s,width=%s,channel=%s"%(heigh,width,channel))
- 遍历所有的像素点 进行修改后展示
def show_info(image): heigh = image.shape[0] width = image.shape[1] channel = image.shape[2] print("heigh:%s,width=%s,channel=%s"%(heigh,width,channel)) for i in range(heigh): for j in range(width): for z in range(channel): temp = image[i,j,z] image[i,j,z] = 130- temp cv.imshow("image",image) src = cv.imread("C:/Users/cznczai/Desktop/Lena.jpg") show_info(src) cv.waitKey(0) cv.destroyAllWindows()
也可以用于 遍历换证件照 【后面会用算法进行优化】
- 也可以用numpy生成的一个三维数组 作为一个图片 如果全0为黑色
def show_info(image): heigh = image.shape[0] width = image.shape[1] channel = image.shape[2] print(image[0,0]) create_image = np.zeros([heigh,width,channel],np.uint8) #黑色 create_image[:,:,:] = 255 # 白色 create_image2 = np.ones([heigh,width,channel],np.uint8)*127 #灰色 print(create_image2) cv.imshow("image",create_image2)
通过 reshape(1,9) 可以重构def show_info(image): arr = np.ones([3,3],np.uint8) arr.fill(111) print(arr) arr2 = arr.reshape([1,9]) print(arr2) [[111 111 111] [111 111 111] [111 111 111]] [[111 111 111 111 111 111 111 111 111]]
视频部分
-
打开视频并且详细代码注解
def video_demo(): capture = cv.VideoCapture(0) # VideoCapture()中参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频,如cap = cv2.VideoCapture(“../test.avi”) while(True): ret ,frame = capture.read() frame = cv.flip(frame,1) #投影镜像对称 cv.imshow("video",frame) c = cv.waitKey(10) # 每个10ms刷新一次 if c != 27: #返回值为k毫秒内键盘按键的ASCII码值 break; # esc键对应的ASCII码是27,即当按esc键是if条件句成立 video_demo() cv.destroyAllWindows()
色彩空间
- 颜色反转 ,我们可以通过每个像素点用255去减 但是效率太慢了 cv中有反转颜色的方法供我们调用
def show_info(image): image = cv.bitwise_not(image) cv.imshow("image",image)
- cv库还有一些rgb->其他类型的像色
def show_info(image): cv.imshow("rgb",image) yuv = cv.cvtColor(image,cv.COLOR_BGR2YUV) cv.imshow("yuv",yuv) ycrcb = cv.cvtColor(image,cv.COLOR_BGR2YCrCb) cv.imshow("ycrcb",ycrcb)
H(0-180) : S(0-255) : V(0-255)
- 用hsv进行识别 分别用视频跟图片进行展示 我们可以参照上面的表 选址目标范围 然后opencv会对图像进行识别【可以对颜色进行跟踪 通过上面的表进行套用】
def show_info(image): hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV) hsv_min = np.array([100,43,46]) hsv_max = np.array([124,255,255]) mark = cv.inRange(hsv,hsv_min,hsv_max) # mark就是黑白图片 cv.imshow("mark",mark)
- 利用通道进行 rgb 三个通道的值的获取
src = cv.imread("C:/Users/cznczai/Desktop/person1.jpg") b , g , r = cv.split(src) print(b) print(g) print(r) image = cv.merge([g,b,r])#cv.merge([b,g,r]) cv.imshow("image",image) cv.waitKey(0) cv.destroyAllWindows()
图形的四则运算
- 加减乘除
def divi(image1 , image2): dst = cv.divide(image1 , image2) cv.imshow("diviv",dst) def mul(image1 , image2): dst = cv.multiply(image1 , image2) cv.imshow("multiply",dst) def add(image1 , image2): dst = cv.add(image1 , image2) cv.imshow("add",dst) def subtract(image1 , image2): dst = cv.subtract(image1 , image2) cv.imshow("subtract",dst)
对于图片一些边角有毛那种 是因为图片附近不是绝对为白色 伪白色那种 放大那种马赛克 导致的,相乘将这种效果更加明显
- 还可以对图片求方差和平均值 , 有时候可以用方差或者平均值来判断图像是否有效
def mean(image1,image2): print(cv.mean(image1)) print(cv.mean(image2)) def dev(image1,image2): print(cv.meanStdDev(image1)) print(cv.meanStdDev(image2))
逻辑运算
- 可以用运算符灵活处理图片
def logic_and(image1,image2):过滤 白色的留下 黑色全为黑色 and_image = cv.bitwise_and(image1,image2) cv.imshow("and",and_image) def logic_or(image1,image2): 叠加 and_image = cv.bitwise_or(image1,image2) cv.imshow("or",and_image) def logic_nor(image1,image2)://否 and_image = cv.bitwise_not(image2) cv.imshow("nor",and_image)
- 也可以处理视频
def show_video(): capture = cv.VideoCapture("C:/Users/cznczai/Desktop/111.mp4") while(True): ret,frame = capture.read() if ret == False: break hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV) hsv_min = np.array([100,43,46]) hsv_max = np.array([124,255,255]) mask = cv.inRange(hsv,hsv_min,hsv_max) dst = cv.bitwise_and(frame,frame,mask=mask) cv.imshow("v",dst) c = cv.waitKey(40) if c == 27: break show_video() cv.waitKey(0) cv.destroyAllWindows()