opencv的python实现·像素处理 像素访问 alpha通道

像素概念

计算机在处理某个图像时,会首先将其划分为一个个小方块,每个小方块是一个独立的处理单位,成为像素点

记录一些基础语法:
,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:返回图像的像素数目

猜你喜欢

转载自blog.csdn.net/qq_41358574/article/details/114043882
今日推荐