
"""
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)