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中的浅复制与深复制
Jul 02 Python
python中map()与zip()操作方法
Feb 27 Python
JPype实现在python中调用JAVA的实例
Jul 19 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
Dec 20 Python
python向已存在的excel中新增表,不覆盖原数据的实例
May 02 Python
关于python2 csv写入空白行的问题
Jun 22 Python
利用python提取wav文件的mfcc方法
Jan 09 Python
python三大神器之fabric使用教程
Jun 10 Python
在Django中实现添加user到group并查看
Nov 18 Python
Windows系统下pycharm中的pip换源
Feb 23 Python
django filter过滤器实现显示某个类型指定字段不同值方式
Jul 16 Python
python爬虫分布式获取数据的实例方法
Nov 26 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
德生PL330测评
2021/03/02 无线电
php批量缩放图片的代码[ini参数控制]
2011/02/11 PHP
PHP常用开发函数解析之数组篇[未完结]
2012/07/30 PHP
PHPThumb图片处理实例
2014/05/03 PHP
php获取随机数组列表的方法
2014/11/13 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
JavaScript 特殊字符
2007/04/05 Javascript
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
Javascript中的this绑定介绍
2011/09/22 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
javascript中常用编程知识
2013/04/08 Javascript
原生JavaScript实现连连看游戏(附源码)
2013/11/05 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
JavaScript 模块化编程(笔记)
2015/04/08 Javascript
详解JavaScript中常用的函数类型
2015/11/18 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
微信公众号服务器验证Token步骤图解
2019/12/30 Javascript
微信小程序实现录制、试听、上传音频功能(带波形图)
2020/02/27 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
微信小程序实现拼图小游戏
2020/10/22 Javascript
python使用xlrd模块读写Excel文件的方法
2015/05/06 Python
Python处理中文标点符号大集合
2018/05/14 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
Python PyQt5整理介绍
2020/04/01 Python
奥地利婴儿用品和玩具购物网站:baby-markt.at
2020/01/26 全球购物
客服专员岗位职责范本
2013/11/29 职场文书
开工庆典邀请函范文
2014/01/16 职场文书
创先争优活动承诺书
2014/08/30 职场文书
乡镇领导干部个人对照检查材料思想汇报
2014/09/23 职场文书
入党积极分子党小组意见
2015/06/02 职场文书
2015年高三教学工作总结
2015/07/21 职场文书
班主任班级管理心得体会
2016/01/07 职场文书
Spring Boot 底层原理基础深度解析
2022/04/03 Java/Android
HTML页面中使两个div并排显示的实现
2022/05/15 HTML / CSS