像素概念
计算机在处理某个图像时,会首先将其划分为一个个小方块,每个小方块是一个独立的处理单位,成为像素点
记录一些基础语法:
,X[:,0]就是取矩阵X的所有行的第0列的元素,X[:,1] 就是取所有行的第1列的元素
python中的小括号( ):代表tuple元组数据类型,元组是一种不可变序列。
python中的中括号[ ],代表list列表数据类型
大括号{ }花括号:代表dict字典数据类型
彩色图像的读取
RGB模式的彩色图像在读入OPENCV进行处理时会按照行方向依次读取该RGB图像的B通道 G通道 R通道的像素点,并将像素点以行为单位存储在ndarray的列中
可以用image[0,0,0]访问图像image的B通道内第0行第0列上的像素点,第一个索引表示第0行,第二个索引为第0列,第三个索引为颜色通道
image[0,0,1] 访问第0行第0列第一个通道的像素值 如果图像是BGR格式,第一个通道是G通道,第0个通道是B通道
使用Numpy生成三维数组,用来观察三个通道值得到变化情况:
import numpy as np
import cv2
blue = np.zeros((300,300,3),dtype=np.uint8)
blue[:, :, 0] = 255
print("blue=",blue)
cv2.imshow("blue",blue)
green = np.zeros((300,300,3),dtype=np.uint8)
green[:, :, 1] = 255
print("green=",green)
cv2.imshow("green",green)
red = np.zeros((300,300,3),dtype=np.uint8)
red[:, :, 2] = 255
print("red=",red)
cv2.imshow("red",red)
cv2.waitKey()
numpy.zeros的官方解释:
numpy.zeros(shape, dtype=float, order=‘C’, *, like=None)¶
Return a new array of given shape and type, filled with zeros.
可以生成一个元素都是0的数组
例子:
> np.zeros(5)
array([ 0., 0., 0., 0., 0.])
np.zeros((5,), dtype=int)
> array([0, 0, 0, 0, 0])
>>>s = (2,2)
>>>np.zeros(s)
array([[ 0., 0.],
[ 0., 0.]])
自定义类型:
>>> numpy.zeros((2,), dtype=[('x', 'i4'), ('y', 'i4')])
array([(0, 0), (0, 0)], dtype=[('x', '<i4'), ('y', '<i4')])
结果:
变化一下:
import numpy as np
import cv2
img = np.zeros((300,300,3),dtype=np.uint8)
img[:,0:100,0]=255
img[:,100:200,1]=255
img[:,200:300,2]=255
cv2.imshow("red",img)
cv2.waitKey()
img[:,0:100,0] 其中冒号表示范围 即0到第100列
img=np.zeros((2,4,3),dtype=np.unit8) 生成一个243大小的数组,对应一个2行4列3个通道的BGR图像 img[0,3]:会访问第0行第3列位置上的B通道G通道R通道三个像素点 img[1,2,2]访问第1行第2列第2个通道的像素点
执行下面语句:
img[0,0] = 244
img[0:100,0:100,2] = 78
print(img[0,0])
输出[244 244 78]
像素访问
numpy.array提供了item()和itemset()函数来访问和修改像素值,item可以更加高效地访问图像的像素点,itemset:修改像素值,语法格式为itemset(索引值,新值)
函数item访问RGB模式图像的像素时,语法格式为item(行,列,通道) 通道不能省略
随机生成一副彩色图像:
import numpy as np
import cv2
img = np.random.randint(0,256,size=[256,256,3],dtype=np.uint8)
cv2.imshow("img",img)
cv2.waitKey()
其中size是图像的尺寸,修改之后图像的大小发生变化,3即三个色彩通道
randint中0,256值随机生成的范围
访问彩色图像并对像素进行修改访问:
for i in range(0,100):
for j in range(0,100):
for k in range(0,3):
img.itemset((i,j,k),255)
ROI感兴趣区域
获取局部区域:
import cv2
import numpy as np
a = cv2.imread("hammer.png",,cv2.IMREAD_UNCHANGED)
face = a[100:600,100:350]
cv2.imshow("face",face)
cv2.waitKey()
通道拆分
通过索引的方式,可以直接将各个通道从图像内提取出来,演示通道拆分的代码:
import cv2
img = cv2.imread("p7.jpg",cv2.IMREAD_UNCHANGED)
a = img[:,:,0]
b = img[:,:,1]
c = img[:,:,2]
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.imshow("c",c)
img[:,:,0] = 0
cv2.imshow("ii",img)
img[:,:,1] = 0
cv2.imshow("i2",img)
img[:,:,2] = 0
cv2.imshow("i3",img)
cv2.waitKey()
结果:
通过函数拆分:
cv2.split函数可以拆分图像的通道,如:
b,g,r = cv2.split(img)
通过函数合并:
cv2.merge()可以合并三个通道为一副彩色图像,其中合并顺序对图像效果有影响
b,g,r = cv2.split(img)
bgr = cv2.merge([b,g,r])
rgb = cv2.merge([r,g,b])
将BGR图像转化为HSV类型的图像并获得卡通效果:
代码
img = cv2.imread("p7.jpg",cv2.IMREAD_UNCHANGED)
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(hsv)
v[:,:] = 255
newhsv = cv2.merge([h,s,v])
cv2.imshow("new",newhsv)
cv2.waitKey()
改变了V通道的值。HSV模式中S V通道的取值一般是[100,255]
alpha通道
RGB色彩空间三个通道的基础上还可以加一个A通道,表示透明度,这种四个通道的色彩空间被称为RGBA色彩空间,PNG是一种典型的4通道图像。alpha通道的赋值范围是[0,1]或者[0,255]表示从透明到不透明。
(img,cv2.COLOR_BGR2BGRA)将img从BGR色彩空间转换到BGRA色彩空间。在转换后的BGRA色彩空间中,A是alpha通道,默认值为255。
bgra = cv2.cvtColor(img,cv2.COLOR_BGR2BGRA)
b,g,r,a = cv2.split(bgra)
a[:,:]=125
bgra = cv2.merge([b,g,r,a])
cv2.imshow("bgra",bgra)
注意bgra = cv2.merge([b,g,r,a])中的括号不能省略
看上去的图像跟原图无差别
一些图像属性:
shape :如果是彩色图像,则返回包含行 列 通道数的数组,如果是二值图像或者灰度图像,则仅仅返回行列数,这个可以判断一个图像是彩色图像还是灰度图像
size:返回图像的像素数目