""" 1.色彩空间:[BGR] (1) HSV: 更类似于人类感觉颜色的方式。H:色相(Hue) S: 饱和度(Saturation0) V: 亮度(Value) (2) YUV: Y: 亮度信号 U/V: 两个色彩信号 -> 色彩的饱和度 (3) Lab: 有国际照明委员会建立。 L: 整张图到的明亮度 a\b: 负责颜色的多少 """ import cv2 import numpy as np from matplotlib import pyplot as plt # img = cv2.imread(r'C:\Users\chenyukun\Pictures\R.png') # cv2.imshow("img", img) # HSV # hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # cv2.imshow("hsv", hsv) # YUV # yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV) # cv2.imshow("yuv", yuv) # LAB # lab = cv2.cvtColor(img, cv2.COLOR_BGR2Lab) # cv2.imshow("lab", lab) # 分离颜色通道 # print(img) # b, g, r = cv2.split(img) # h, w = np.shape(b) # # 建立空白数组 # hest = np.zeros([256], dtype=np.int32) # print(hest) # # 遍历图片 # for i in [b, g, r]: # for row in range(h): # for col in range(w): # pv = i[row, col] # hest[pv] += 1 # plt.plot(hest, color='r') # plt.show() # cv2.waitKey(100000) # array1 = np.random.randint(0, 255, (300, 150, 3), dtype=np.uint8) # array2 = np.random.randint(200, 255, (300, 150, 3), dtype=np.uint8) # new_array = np.hstack([array1, array2]) # cv2.imshow("new_array", new_array) # cv2.waitKey(100000) # 彩色图片 -> BGR # 查看B # img_B = img.copy() # img_B[:, :, 1] = 0 # img_B[:, :, 2] = 0 # cv2.imshow("img_B", img_B) # cv2.waitKey(100000) # 查看G # img_G = img.copy() # img_G[:, :, 0] = 0 # img_G[:, :, 2] = 0 # cv2.imshow("img_G", img_G) # cv2.waitKey(100000) # 查看G # img_R = img.copy() # img_R[:, :, 0] = 0 # img_R[:, :, 1] = 0 # cv2.imshow("img_R", img_R) # cv2.waitKey(100000) # 深入研究图片的读取 """ cv2.imread(path, way) 0: 读取灰度图片 1: 读取彩色图片 -1: 读取图片,加载Alpha通道 Alpha通道: 指一张图片的透明与不透明度 """ img_color = cv2.imread(r'C:\Users\chenyukun\Pictures\R.png') img_gray = cv2.imread(r'C:\Users\chenyukun\Pictures\R.png', 0) img_transparent = cv2.imread(r'C:\Users\chenyukun\Pictures\R.png', -1) """ 彩色图像:三维 B G R -> (373*490) 灰度图像:二维:-> (373*490) 推断出的公式: Y = (B+G+R)/3 官方给出的公式: Y = 0.299R + 0.587G + 0.114B cv.imshow() -> 不仅仅是array()必须是uint8这种类型的。 """ # 三通道分离 # b, g, r = cv2.split(img_color) # new_img = (b+g+r)/3 # new_img = 0.299*r + 0.587*g + 0.114*b # new_img = new_img.astype('uint8') # cv2.imshow('new_img', new_img) # 官方的填充方式: 以初始的灰度二维矩阵进行RGB通道的填充 # new_image = cv2.merge([img_gray,img_gray,img_gray]) # cv2.imshow('new_img', new_image) # cv2.waitKey(100000) # 图像的加法 -> 矩阵 # 加法 【前提:必须是一样大小的矩阵:对应的元素求和】 """ 像素点: [0,255]超过255怎么办?【取余】 150+150=300 300%255 """ """ 图片融合 addWeighted(src1, alpha, src2, beta, gamma) src1\src2: 第一张和第二张图片 alpha\beta: 第一张图片的权重、第二张图片的权重 gamma: 亮度的调节 """ # result = cv2.addWeighted(img_color, 0.6, img_color, 0.3, 0) # cv2.imshow('new_img', result) # cv2.waitKey(100000) # # # 图像的类型转换 # # 原始图片BGR -> RGB # cv2.cvtColor(img_color, cv2.COLOR_BGR2RGB) """ 1.沿着x轴进行翻转 2.沿着y轴进行翻转 3.同时沿着x轴和y进行翻转 cv2.flip(src, flipCode) src: 源图像 flipCode: 翻转形式 0:沿着x轴进行翻转 1(大于等于1): 沿着y轴进行翻转 -1(小于等于-1): 同时沿着x轴和y进行翻转 """ """ 图像阈值化处理 ret, dst = cv2.threshold(src, thresh, maxval, type) ret: 阈值返回值(阈值设定的是多少) dst: 输出的图像 src: 源图像 需要阈值化处理的图像 thresh: 人为指定的阈值 maxval: 当像素超过了阈值,(小于等于阈值)所赋予的值,否则取0 type: (1) cv2.THRESH_BINARY: 当像素点大于阈值时,取指定255,小于等于阈值时,取0 (2) cv2.THRESH_BINARY_INV: 当像素点大于阈值时,取0。小于等于阈值时,取255 (3) cv2.THRESH_TRUNC: 超过阈值取阈值,低于阈值取自身 (4) cv2.THRESH_TOZERO: 超过阈值不变,低于阈值取0 (5) cv2.THRESH_TOZERO_INV: 超过阈值变为0, 低于阈值不变 注意:当阈值处理彩色图像时,出现粉色等颜色的原因在于: BGR三通道的叠加 """ # ret, dst = cv2.threshold(img_color, 127, 255, cv2.THRESH_BINARY) # cv2.imshow('new_img', dst) # cv2.waitKey(100000) """ 均值滤波 cv2.blur(src, kernel) src: 源图像 kernel: 大小(选择多大的矩阵进行平移[3*3最常见]) """ # new_img = cv2.blur(img_color, (3, 3)) # cv2.imshow('new_img', new_img) # cv2.waitKey(100000) """ 方框滤波 cv2.boxFilter(src,depth, ksize, normalize) src: 源图像 depth: 图像的深度 填-1就ok, 表示与源图像深度相同 ksize: 核大小(3*3)(5*5) normalize: 是否进行归一化 0:false 不进行归一下(求和,像素点溢出,超过255取255) 1:True 进行归一化,也就是均值滤波 """ """ 高斯滤波【考虑了权重问题】 cv2.GaussianBlur(src, ksize, sigmaX, sigmaY) src:源图像 ksize: (3*3)(5*5) 必须为奇数 sigmaX, sigmaY: 高斯核函数在x或y方向上的标准偏差【控制权重】 sigmaX = 0, sigmaX = 0.3 * ((ksize -1) * 0.5 -1) + 0.8 """ ''' 中值滤波 cv2.medianBlur(src, ksize) src: 源图像 ksize:核大小, 只能传递int(1,3,5,7,9)【(3, 3)(5, 5)】 ''' new_img = cv2.medianBlur(img_color, 5) cv2.imshow('new_img', new_img) cv2.waitKey(100000)