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

it2022-05-05  125

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]这个地方 结果实例: (2)将两张图调整一样的大小,叠加在一起。 结果 (3)调整两张图片各自的权重 程序函数讲解 (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)

最新回复(0)