opencv与numpy的图像基本操作


Posted in Python onMarch 08, 2019

1. 像素基本操作

1.1 读取、修改像素

可以通过[行,列]坐标来访问像素点数据,对于多通道数据,返回一个数组,包含所有通道的值,对于单通道数据(如gray),返回指定坐标的值,也可以通过 [行,列,通道index] 来访问某坐标某通道的值。

>>> import cv2
>>> import numpy as np
>>> img = cv2.imread('messi5.jpg')
>>> px = img[100,100]
>>> print( px )
[157 166 200]
# accessing only blue pixel
>>> blue = img[100,100,0]
>>> print( blue )
157

可以直接通过坐标修改像素值

>>> img[100,100] = [255,255,255]
>>> print( img[100,100] )
[255 255 255]

然而直接像上面这样去读取、修改每个像素的值,效率是比较低的,可以使用下面的方法,效率是更高的

# accessing RED value
>>> img.item(10,10,2)
59
# modifying RED value
>>> img.itemset((10,10,2),100)
>>> img.item(10,10,2)
100

1.2 读取图像属性

读取图像尺寸,返回一个元组 (行,列,通道数)

>>> print( img.shape )
(342, 548, 3)

读取像素大小, 行 通道数

>>> print( img.size )
562248

像素数据类型

>>> print( img.dtype )
uint8

1.3 图像ROI操作

可以直接编辑像素区域,例如把图像左下角50*50的像素复制到左上角

import cv2
import numpy as np
img = cv2.imread("test.jpg")
print(img.shape)
roiTest = img[475:525, 0:50]
img[0:50, 0:50] = roiTest
cv2.imshow("image",img)
cv2.waitKey(0)

opencv与numpy的图像基本操作

1.4 分割、合并通道

有些情况下需要对图像的某一通道数据进行操作,此时会用到分割、合并通道数据

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

或者

b = img[:,:,0]

假设想编辑红色通道的数据,全部设置为0,不需要这样分割后编辑, img[:,:,2] = 0 这样即可。cv2.split操作是一个很耗时的操作,可以用numpy索引替代的操作,尽量用numpy索引来做。

1.4 生成图像边框

使用 cv2.copyMakeBorder 函数可添加图像边框,支持多种边框算法

void cv::copyMakeBorder ( 
InputArray src, //原图
//目标图(cpp版本中,若传入此数据且选BORDER_TRANSPARENT,则此数据被top/bottom/left/right切出来的roi部分不会被做任何修改,此图像大小=dst.rows+top+bottom,dst.cols+left+right)
OutputArray dst, 
int top, //top/left/bottom/right 四个方向上的边框像素
int bottom,
int left,
int right,
int borderType, //边框类型见下图
const Scalar & value = Scalar() //边框类型为BORDER_CONSTANT时的边框像素
)

opencv与numpy的图像基本操作

BLUE = [255, 0, 0]
 img1 = cv2.imread("test.jpg")
 replicate = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_REPLICATE)
 reflect = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_REFLECT)
 reflect101 = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_REFLECT_101)
 wrap = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_WRAP)
 constant = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_CONSTANT, value=BLUE)
 print(img1.shape, reflect.shape)
 plt.subplot(231), plt.imshow(img1, 'gray'), plt.title('ORIGINAL')
 plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
 plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
 plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101')
 plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
 plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')
 plt.show()

opencv与numpy的图像基本操作 

上面的例子可以比较直观的看到各种border的效果,同时也能发现,python版的api与cpp版本的相比,默认初始化了一块原始图尺寸+各方向边框尺寸的图像内存,作为内置的dst参数。

输出尺寸:(525, 700, 3) (725, 900, 3)

2. 图像的基本算术操作

2.1 图像相加

图像相加,两个图像应该有相同的shape,或者图像和一个标量相加,或者图像和一个与其通道数相同的一维数组相加。

opencv的相加与numpy相加时,在超出数据类型范围时的处理不同

>>> x = np.uint8([250])
>>> y = np.uint8([10])
>>> print( cv2.add(x,y) ) # 250+10 = 260 => 255
[[255]]
>>> print( x+y )  # 250+10 = 260 % 256 = 4
[4]

cpp版本的api还支持mask等参数

void cv::add ( 
InputArray src1,
InputArray src2,
OutputArray dst,
InputArray mask = noArray(),
int dtype = -1 
)

2.2 图像混合

opencv通过 cv::addWeighted 函数提供了将两个图像混合在一起的方法

dst=α⋅img1+β⋅img2+γ

img1 = cv2.imread('ml.png')
img2 = cv2.imread('opencv-logo.png')
dst = cv2.addWeighted(img1,0.7,img2,0.3,0)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

opencv与numpy的图像基本操作

通过cv2.seamlessClone函数还能做更精细的图像局部融合。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中使用OpenCV进行人脸检测的例子
Apr 18 Python
Python def函数的定义、使用及参数传递实现代码
Aug 10 Python
python实现根据窗口标题调用窗口的方法
Mar 13 Python
Python中文分词实现方法(安装pymmseg)
Jun 14 Python
Python中字符串的常见操作技巧总结
Jul 28 Python
利用Python破解验证码实例详解
Dec 08 Python
Python实现FTP上传文件或文件夹实例(递归)
Jan 16 Python
Python yield 使用方法浅析
May 20 Python
Django restframework 框架认证、权限、限流用法示例
Dec 21 Python
Python填充任意颜色,不同算法时间差异分析说明
May 16 Python
基于CentOS搭建Python Django环境过程解析
Aug 24 Python
Flask处理Web表单的实现方法
Jan 31 Python
Python脚本修改阿里云的访问控制列表的方法
Mar 08 #Python
python实现整数的二进制循环移位
Mar 08 #Python
Python3实现的反转单链表算法示例
Mar 08 #Python
Python3实现的判断回文链表算法示例
Mar 08 #Python
python字符串循环左移
Mar 08 #Python
详解Python Matplot中文显示完美解决方案
Mar 07 #Python
详解Python安装tesserocr遇到的各种问题及解决办法
Mar 07 #Python
You might like
php下实现伪 url 的超简单方法[转]
2007/09/24 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
360通用php防护代码(使用操作详解)
2013/06/18 PHP
php+html5基于websocket实现聊天室的方法
2015/07/17 PHP
thinkPHP删除前弹出确认框的简单实现方法
2016/05/16 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
基于Jquery的温度计动画效果
2010/06/18 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
nodejs实现黑名单中间件设计
2014/06/17 NodeJs
jQuery中each()方法用法实例
2014/12/27 Javascript
jquery实现增加删除行的方法
2015/02/03 Javascript
JS实现JSON.stringify的实例代码讲解
2017/02/07 Javascript
jQuery插件echarts去掉垂直网格线用法示例
2017/03/03 Javascript
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
AngularJS自定义指令详解(有分页插件代码)
2017/06/12 Javascript
单页面vue引入百度统计的使用方法示例详解
2018/10/13 Javascript
vue实现图片裁剪后上传
2020/12/16 Vue.js
Python中getattr函数和hasattr函数作用详解
2016/06/14 Python
Python实现扩展内置类型的方法分析
2017/10/16 Python
python中实现精确的浮点数运算详解
2017/11/02 Python
Django rest framework工具包简单用法示例
2018/07/20 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
python pillow模块使用方法详解
2019/08/30 Python
python 多进程队列数据处理详解
2019/12/23 Python
django 模型中的计算字段实例
2020/05/19 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
2020/05/24 Python
Python中zipfile压缩文件模块的基本使用教程
2020/06/14 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
2020/11/30 Python
CSS3 实现的火焰动画
2020/12/07 HTML / CSS
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
《哪吒闹海》教学反思
2014/02/28 职场文书
乡镇党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
基于Go Int转string几种方式性能测试
2021/04/28 Golang
java版 简单三子棋游戏
2022/05/04 Java/Android