opencv-python-学习笔记五(图像的基本操作)

python-opencv中的图像表示

  OpenCV中图像读入的数据格式是numpy的ndarray数据格式。用数组描述图像。是BGR格式,取值范围是[0,255].

分为三个维度:

第一维度:Height 高度,对应图片的 行数

第二维度:Width 宽度,对应图片的 列数

第三维度:Value  代表BGR三通道的值   在opencv中,其中 0代表B,1代表G,2代表R

import cv2 as cv
import numpy as np


img = np.zeros((3, 2, 3), np.uint8)#三行两列3个通道
cv.imshow("image", img)
k = cv.waitKey(0) & 0xFF

获取单一像素值和修改

方法一:直接访问

以下参数含义:

x:x坐标

y:y坐标

0:B通道   1:G通道  2:R通道

首先加载一张彩色图片

import cv2
import numpy as np

img = cv2.imread('4.jpg')

访问像素

px = img[y,x]
print(px)  # 输出值是 x,y 处,蓝b,绿g,红r 的数组  [100,200,190] 
px = img[y,x,0]
print(px)  # 指定输出x,y处 ,0(B)通道的像素值  结果等于 157

修改像素

 

img[y, x] = [255, 255, 255]  # 修改(x,y)处3个通道的像素值为 [255,255,255]

 

方法二:通过numpy优化库

Numpy是一个优化的库,能够快速计算数组。所以如果一个个访问每个像素并修改它的值是很慢的,也不推荐。一般来说都是选择数组的一片区域进行修改。

首先加载一张彩色图片

import cv2
import numpy as np

img = cv2.imread('4.jpg')

读取

print(img.item(10, 10,2))

  如果想要访问BGR3个通道的值,需要分开访问,调用3次

修改

img.itemset((10, 10, 2), 100)

图片ROI(region of interest)

有时候,你会需要处理图片的特定区域。对于图片的眼部识别,首先对整个图片进行面部识别,找到脸以后,在脸的区域内找眼睛。这个方法能够提高准确度(因为眼睛总是在脸上的)性能上也好(因为我们找的区域更小)

截取图片

import cv2 as cv
import numpy as np


img = cv.imread('4.jpg')

ball = img[280:340, 330:390] #img[y1:x1,y2:x2]  y1:x1 对角线左上点的值  y2:x2  对角线右下点的值 
img[100:160, 150:210] = ball #img[y1:x1,y2:x2]

cv.imshow("image",img) cv.waitKey(0)

 

 

 

图像通道的分割和合并

有时候可能需要将图片的3个通道分割出来,有时候会需要将一个通道合并到其它通道。

拆分通道

方法1:

b,g,r = cv.split(img)

 参数:

 img:待拆分图像

方法2:

b = img[:,:,0]  #只获取图像的一个通道

注意:假设你想把所有的红色像素变成0,你不用这么分割,你可以简单的使用Numpy索引,这样更快。img[:,:,2]=0

警告:cv2.split()是一个成本很高的操作(执行时间),所以只在必要的时候使用。Numpy索引要更有效率,能用就用。

合并通道

 dst=cv.merge(mv[, dst])

 参数:

 

img = cv.merge((b,g,r)) 

 制作图片相框

posted @ 2019-07-07 11:16  少灬儿郎  Views(406)  Comments(0Edit  收藏  举报