OpenCV笔记8:对图像进行一些基本算术运算

1、学习目标
对图像进行一些基本和算术运算。
在此次实验中
(1)更改图片上一些图形(感兴趣的区域ROI)的位置
(2)叠加两张图片
2、使用函数方法
img.shape:返回行数,列数和通道数的元组
img.size:返回访问的总像素数
img.dtype:返回获取Image数据类型
cv2.split(img):数组的输出向量;如果需要,数组本身将被重新分配。
cv2.merge((b,g,r)):通道数将是矩阵数组中通道的总数
cv2.resize(): 调整图像大小
cv2.add(img,img2): 计算两个数组或数组和标量的每元素总和。
cv2.addWeighted(img,.2,img2,.8,0):计算两个数组的加权和。
3、程序
(1)把图像中的ball这个图形从[7:9, 10,14]这个部位移到[2:3, 5:8]这个地方
OpenCV笔记8:对图像进行一些基本算术运算_第1张图片
结果实例:
OpenCV笔记8:对图像进行一些基本算术运算_第2张图片
(2)将两张图调整一样的大小,叠加在一起。
OpenCV笔记8:对图像进行一些基本算术运算_第3张图片
结果
OpenCV笔记8:对图像进行一些基本算术运算_第4张图片
(3)调整两张图片各自的权重
OpenCV笔记8:对图像进行一些基本算术运算_第5张图片
程序函数讲解
(1)访问和修改像素值
加载彩色图像

 import cv2
 import numpy as np
 img = cv2 .  imread ( 'messi5.jpg' )

通过行和列坐标访问像素值。 对于BGR图像,它返回一个蓝色,绿色,红色值的数组。 对于灰度图像,仅返回相应的强度。

px = img [ 100 , 100 ]
print px

得到的结果
 [157 166 200]

# 仅访问蓝色像素
  blue = img [ 100 , 100 , 0 ]
  print blue
  
 得到结果
 157

以相同的方式修改像素值

img [ 100 , 100 ] = [ 255 , 255 , 255 ]
print img [ 100 , 100 ]

得到结果
[255 255 255]

修改像素值的其他更好的方法

# 获得red的像素值
img .  item ( 10 , 10 , 2 )
结果 59

# 修改red的像素值
img .  itemset (( 10 , 10 , 2 ), 100 )
img .  item ( 10 , 10 , 2 )
结果100

(2)访问图像属性
图像属性包括行数,列数和通道数,图像数据类型,像素数等。

(a)访问图像的形状

img.shape 
返回一组行,列和通道的元组(如果图像是彩色的)
如果图像是灰度,则返回的元组仅包含行数和列数。

(b)访问的像素总数

img.size

(c)图像数据类型

img.dtype

img.dtype在调试时非常重要,
因为OpenCV-Python代码中的大量错误是由无效的数据类型引起的。

(3)图像
(a)对图像的某一区域进行处理
(例如,对于图像中的眼睛检测,在整个图像上进行第一次面部检测,并且当获得面部时,我们单独选择面部区域并搜索其内部的眼睛而不是搜索整个图像)
例如上述程序(1)
使用Numpy索引再次获得ROI
选择球并将其复制到图像中的另一个区域

ball = img[280:340, 330:390]
img[273:333, 100:160] = ball

(b)拆分和合并图像通道
在B,G,R通道图像上单独工作
将BGR图像分割为单个平面
或者将这些单独的通道连接到BGR图像。

b,g,r = cv2.split(img)
img = cv2.merge((b,g,r))

b = img[:,:,0]

将所有红色像素设为零,使用Numpy索引

img[:,:,2] = 0

cv2.split()是一项代价高昂的操作(就时间而言)。 所以只有在你需要时才这样做。 否则去Numpy索引。

内容来自
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html

(4)计算两个数组的加权和。

cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst

此函数可以用一下矩阵表达式来代替:
dst = src1 * alpha + src2 * beta + gamma;


alpha 为 src1 透明度,beta 为 src2 透明度

src1   - 第一个输入数组。
alpha  - 第一个数组元素的权重。
src2   - 与src1具有相同大小和通道编号的第二个输入数组。
beta   - 第二个数组元素的权重。
dst    - 与输入数组具有相同大小和通道数的输出数组。
gamma  - 标量加到每个总和。
dtype  - 输出数组的可选深度;当两个输入数组具有相同的深度时,
        dtype可以设置为-1,这相当于src1.depth()

程序中的例子

cv2.addWeighted(img,.2,img2,.8,0)

你可能感兴趣的:(OpenCV,python)