一、安装

pip install opencv-python

二、导入

import cv2

三、长,宽,通道

1、通道介绍

通道包含用于构成其他颜色的基础色彩,三种基本颜色是红绿蓝。

在通道的每一个像素点上,都有[0,255]之间的整数值,这些书值代表了“该通道上颜色的灰度”。

在图像的语言中:“灰度”就是明亮程度。数字越接近255,就代表颜色明亮程度越高,越接近通道本身的颜色。数字越接近0,就代表颜色的明亮程度越弱,也就是越接近黑色。
例如:白色RGB(255,255,255) 黑色RGB(0,0,0)
如果红色通道是黑色的,说明红色对图片几乎没有贡献。如果绿色通道比较明亮,说明绿色对图片贡献比较多。

在图像的矩阵中,我们可以使用索引找出任意像素的三个通道上的颜色的明度,例如,对于第0行、第0列的样本而言,可以看到一个三列的矩阵,这三列就分别代表着红色、绿色、蓝色的像素值。当三个值都不为0时,这个像素在三个通道上都有颜色。相对应的,最纯的红色会显示为(255,0,0),最纯的蓝色就会显示为(0,0,255),绿色可以此类推。当像素值为(0,0,0)时,这个像素点就为黑色,当像素值为(255,255,255), 像素点就为白色。通道上像素的灰度,也就是矩阵中的值,几乎100%决定了图像会呈现出什么样子。

饱和度:颜色是否鲜艳。

2、通道类型

在图像的世界中有许多通道”类型,就和计算机世界有许多编码类型-样,较为常见的通道有以下几种:

(1)灰度通道

灰度在计算机视觉中是指“明暗程度”,而不是指“灰色”。因而灰度通道也不是指图像是灰色的通道,而是只有一种颜色的通道。同理,灰度图像是只有一个通道的图像。所以RGB通道中的任意一个通道单独拿出来之后, 都可以用灰度(明暗) 来显示。就像我们在Fashion-MNIST数据集中所见到的,灰度图像的shape最后一列为1, 索引出来的值中只有一个数字,这个数字就是这种唯一颜色的明度。当你看见图像的通道数为1, 无论可视化之后图像显示什么视觉颜色,它都只是表示单一颜色的明度而已。(没有人怀疑过为什么fashion-MNIST中的图绘制出来是黄绿色的吗?你现在了解,其实蓝绿色也只是明度的一种表示)。

(2)RGB色彩空间

数字世界最常见的彩色通道,分别表示红、绿、蓝三种电子成像的基本颜色。

(3)CMYK色彩空间

用于彩色打印机成像的通道,由青色(Cyan) 、品红(Magenta) 、黄色(Yellow) 和黑色(Black) 构成,因此是四维通道,在图像结构中会显示为(高度,宽度,4)。

(4)HSV (或HSL)色彩空间

HSV通道是为人们描述和解释颜色创建的,H代表色相,S代表饱和度,V代表亮度。
以上三种空间可以自由切换(会产生数据损失),在OpenCV中也有支持切换的函数可以调用。在计算机视觉中,我们可能遇见各种通道类型的图片,当我们需要对图像进行特定操作时,我们必须了解这些通道并了解如何在他们之间进行转换。

(5)RGBA色彩空间

拥有四维通道,分别是(红色,绿色,蓝色,透明度alpha)。透明度alpha的取值范围在0-1之间。当-一个像素的RGB显示为(0 ,255,0)时,则说明这个像素里是明度最高的绿色,但加H透明度之后,色彩就会变得透明”。RGBA可以提供更丰富的色彩样式,让图像的色彩变得更加绚丽。

3、OpenCV令像素变化来改变图像

(1)默认读取

import numpy as np
import cv2
import matplotlib.pyplot as plt
#读取计算机中的图像,导入一张喜欢的图片
img = cv2.imread('D:/My life/girl.jpeg')#不要有中文,不要有空格.尽量改成/,不要用r'\'   
img.shape

(562, 1000, 3)

# 展示图片
plt.figure(dpi=150)  # 画布,dpi是分辨率,通常用300
plt.imshow(img)
plt.axis('off');  # 不显示坐标轴

结果发现颜色有点阴间:

在这里插入图片描述

(2)切换为RGB

openCV默认读取后的图像通道是BGR,红蓝搞反了。因此我们需要将图像的通道转化成RGB。

img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#也可以通过使用补偿为-1的逆序索引来进行转换  img = imt[:,:,:,:-1]

#再次展示图片
plt.figure(dpi=150)#画布,dpi是分辨率,通常用300
plt.imshow(img)
plt.axis('off');#不显示坐标轴

在这里插入图片描述

img.dtype

dtype(‘uint8’)

a = np.array([0,1,255],dtype="uint8")
a

array([ 0, 1, 255], dtype=uint8)

不能直接进行线性变换:

a + 10 ,a - 10#255+9=265  

(array([10, 11, 9], dtype=uint8), array([246, 247, 245], dtype=uint8))

应该把img变成浮点型:

img = img*1.0
b = np.array([280,-3,250])
np.clip(b,0,255)#用来将数字限制在某个范围内的函数   允许的最小值,允许的最大值

array([255, 0, 250])

img = img/255   #归一化

(3)调亮画面

img_ = np.clip(img + 100/255,0,1)#np.clip是一个抹掉范围外值的函数。像素值越接近255,越鲜艳
plt.figure(dpi = 100)
plt.imshow(img_)
plt.axis('off');

在这里插入图片描述

(4)调暗画面

img_ = np.clip(img - 100/255,0,1)#np.clip是一个抹掉范围外值的函数
plt.figure(dpi = 100)
plt.imshow(img_)
plt.axis('off');

在这里插入图片描述

(5)让画面更鲜艳

img_ = np.clip(img*2,0,1)#np.clip是一个抹掉范围外值的函数
#对于乘法img*2来说,原来很大的值会增长得更快,因此原本就很鲜艳的颜色会变得更加鲜艳,增加对比度
plt.figure(dpi = 100)
plt.imshow(img_)
plt.axis('off');

在这里插入图片描述

(6)调整饱和度

注:读取文件路径时不要有中文,不要有空格。尽量改成/,不要用r’’
img = cv2.imread('D:/My life/girl.jpeg')  # 不要有中文,不要有空格.尽量改成/,不要用r'\' 

"""
openCV默认读取后的图像通道是BGR,为了调整饱和度,直接将通道转化为HSV
"""
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(img_hsv)#分解为h,s,v

"""
#这里分解出的是uint8,要在uint8上进行数值操作则必须先更换为浮点数。openCV只能处理uint8
h += np.clip(s*1.0 + 100,0, 255).astype("uint8") #色相
s += np.clip(s*1.0 + 100,0, 255).astype("uint8") #饱和度
v += np.clip(s*1.0 + 100,0, 255).astype("uint8") #亮度
"""
final_hsv = cv2.merge((h, s, v))#合并回一张完整的h,s,v图像

"""
为了绘图,这里是转回RGB,而不是BGR
"""
img_s = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2RGB)
plt.figure(dpi=100)
plt.imshow(img_s)
plt.axis('off');

在这里插入图片描述

在掌握了一些浅层图像原理之后,就可以通过改变像素值来改变图像的模样。这再次证明了,通道上像素的灰度,也就是张量中的值几乎100%决定了图像会呈现出什么样子。因此,只要给与[0,255]之间的值,令其结构形似一张图像(高,宽,3),我们甚至可以自己“瞎编”出一张图像来,所以任意矩阵都可以被以图像的方式进行可视化。

值得注意的是,由于灰度的存在,图像是可以被表示成二元函数。通常写作f(x,y)或f(i,j)。在这个函数中,函数的两个自变量是图像的宽度与高度,函数值就是该通道上的灰度。

pic = np.random.randint(0,255,size=(300,300,3)) 
plt.figure(dpi=100)
plt.imshow(pic)
plt.axis('off');

在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐