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实现HTTP协议下的文件下载方法总结
Apr 20 Python
python处理按钮消息的实例详解
Jul 11 Python
Python使用Django实现博客系统完整版
Sep 29 Python
Python SVM(支持向量机)实现方法完整示例
Jun 19 Python
Python实现的tcp端口检测操作示例
Jul 24 Python
python实现银联支付和支付宝支付接入
May 07 Python
Python产生一个数值范围内的不重复的随机数的实现方法
Aug 21 Python
python图片二值化提高识别率代码实例
Aug 24 Python
python使用正则来处理各种匹配问题
Dec 22 Python
简单了解Python write writelines区别
Feb 27 Python
python列表删除和多重循环退出原理详解
Mar 26 Python
Python采集壁纸并实现炫轮播
Apr 30 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 UBB 解析实现代码
2011/11/27 PHP
Php Ctemplate引擎开发相关内容
2012/03/03 PHP
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
深入理解JavaScript定时机制
2010/10/29 Javascript
js选取多个或单个元素的实现代码(用class)
2012/08/22 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
jQuery中json对象的复制方式介绍(数组及对象)
2013/06/08 Javascript
Javascript加载速度慢的解决方案
2014/03/11 Javascript
Javascript实现网络监测的方法
2015/07/31 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
2016/02/15 Javascript
jQuery深拷贝Json对象简单示例
2016/07/06 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
解析Json字符串的三种方法日常常用
2018/05/02 Javascript
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
react+redux仿微信聊天界面
2019/06/21 Javascript
js实现飞机大战小游戏
2020/08/26 Javascript
解决ant Design Search无法输入内容的问题
2020/10/29 Javascript
[00:57]辉夜杯战队访谈宣传片—VG
2015/12/25 DOTA
[01:33]DOTA2上海特级锦标赛 LIQUID战队完整宣传片
2016/03/16 DOTA
python简单实现获取当前时间
2016/08/27 Python
Python安装第三方库及常见问题处理方法汇总
2016/09/13 Python
Python迭代器定义与简单用法分析
2018/04/30 Python
Django的models中on_delete参数详解
2019/07/16 Python
Python数据持久化存储实现方法分析
2019/12/21 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
2020/02/28 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
python Matplotlib数据可视化(1):简单入门
2020/09/30 Python
详解python的super()的作用和原理
2020/10/29 Python
公司股权转让协议书
2014/04/12 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
关于国庆节的演讲稿
2014/09/05 职场文书
县级领导干部开展党的群众路线教育实践活动工作汇报
2014/10/25 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
区域销售大会开幕词
2016/03/04 职场文书
python实现高效的遗传算法
2021/04/07 Python