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文件操作相关知识点总结整理
Feb 22 Python
python使用tkinter实现简单计算器
Jan 30 Python
解决python3爬虫无法显示中文的问题
Apr 12 Python
对python sklearn one-hot编码详解
Jul 10 Python
python和c语言的主要区别总结
Jul 07 Python
浅谈Pytorch中的torch.gather函数的含义
Aug 18 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
关于python中的xpath解析定位
Mar 06 Python
Python爬虫之爬取淘女郎照片示例详解
Jul 28 Python
有关pycharm登录github时有的时候会报错connection reset的问题
Sep 15 Python
Python调用Redis的示例代码
Nov 24 Python
OpenCV实现常见的四种图像几何变换
Apr 01 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实现rc4加密算法代码
2012/04/25 PHP
php共享内存段示例分享
2014/01/20 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
2016/03/21 PHP
JScript内置对象Array中元素的删除方法
2007/03/08 Javascript
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
Chrome中JSON.parse的特殊实现
2011/01/12 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
javascript学习笔记(十) js对象 继承
2012/06/19 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
JavaScript执行顺序详细介绍
2013/12/04 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
2014/11/06 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
js仿手机页面文件下拉刷新效果
2016/10/14 Javascript
jquery操作ID带有变量的节点实例
2016/12/07 Javascript
微信小程序 商城开发(ecshop )简单实例
2017/04/07 Javascript
微信小程序 支付后台java实现实例
2017/05/09 Javascript
NodeJS实现微信公众号关注后自动回复功能
2017/05/31 NodeJs
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
详解解决使用axios发送json后台接收不到的问题
2018/06/27 Javascript
JS立即执行函数功能与用法分析
2019/01/15 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
2020/03/03 Javascript
python fabric使用笔记
2015/05/09 Python
python抽象基类用法实例分析
2015/06/04 Python
win10系统中安装scrapy-1.1
2016/07/03 Python
Django实现快速分页的方法实例
2017/10/22 Python
用CSS禁用输入法(CSS3 UI规范)实例解析
2012/12/04 HTML / CSS
css 省略号 css3让多余的字符串消失并附加省略号的实现代码
2013/02/07 HTML / CSS
美国嘻哈文化生活方式品牌:GLD
2018/04/15 全球购物
比驿:全球酒店比价网
2018/06/20 全球购物
师范学院毕业生求职信范文
2013/12/26 职场文书
自我评价范文分享
2014/01/04 职场文书
父亲生日宴会答谢词
2014/01/10 职场文书
干部个人考察材料
2014/12/24 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
小学四年级班务总结该怎么写?
2019/08/16 职场文书
85句关于理想的名言警句大全
2019/08/22 职场文书