tuoheng_algN/test/opencv/test.py

198 lines
5.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
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*35*5
normalize: 是否进行归一化
0false 不进行归一下求和像素点溢出超过255取255
1True 进行归一化,也就是均值滤波
"""
"""
高斯滤波【考虑了权重问题】
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)