opencv图像识别基础知识(opencv与numpy的图像基本操作)
opencv图像识别基础知识
opencv与numpy的图像基本操作1. 像素基本操作
1.1 读取、修改像素
可以通过[行,列]坐标来访问像素点数据,对于多通道数据,返回一个数组,包含所有通道的值,对于单通道数据(如gray),返回指定坐标的值,也可以通过 [行,列,通道index] 来访问某坐标某通道的值。
|
>>> import cv2 >>> import numpy as np >>> img = cv2.imread( 'messi5.jpg" alt="opencv图像识别基础知识(opencv与numpy的图像基本操作)" border="0" /> |
|
>>> 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" alt="opencv图像识别基础知识(opencv与numpy的图像基本操作)" border="0" /> print (img.shape) roitest = img[ 475 : 525 , 0 : 50 ] img[ 0 : 50 , 0 : 50 ] = roitest cv2.imshow( "image" ,img) cv2.waitkey( 0 ) |
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时的边框像素 ) |
|
blue = [ 255 , 0 , 0 ] img1 = cv2.imread( "test.jpg" alt="opencv图像识别基础知识(opencv与numpy的图像基本操作)" border="0" /> 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() |
上面的例子可以比较直观的看到各种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.jpg" alt="opencv图像识别基础知识(opencv与numpy的图像基本操作)" border="0" /> img2 = cv2.imread( 'opencv-logo.jpg" alt="opencv图像识别基础知识(opencv与numpy的图像基本操作)" border="0" /> dst = cv2.addweighted(img1, 0.7 ,img2, 0.3 , 0 ) cv2.imshow( 'dst' ,dst) cv2.waitkey( 0 ) cv2.destroyallwindows() |
通过cv2.seamlessclone函数还能做更精细的图像局部融合。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:https://www.zoucz.com/blog/2019/03/07/50ef43b0-40a5-11e9-9947-3d7b79f522a2/
- python opencv替换背景教程(基于OpenCV python3实现证件照换背景的方法)
- opencv调用摄像头图像识别(Python+OpenCV采集本地摄像头的视频)
- opencv 图像匹配python(OpenCV+Python识别车牌和字符分割的实现)
- opencv怎么设置图像形态(OpenCV图像颜色反转算法详解)
- opencv人脸识别算法(python利用Opencv实现人脸识别功能)
- python怎么装opencv(Python基于opencv实现的简单画板功能示例)
- opencv人脸识别效果好吗(通过opencv制作人脸识别的窗口)
- python的opencv图片识别(OpenCV-Python 摄像头实时检测人脸代码实例)
- opencv抠出边缘检测的图形(python opencv实现图像边缘检测)
- opencv自带的人脸识别(Dlib+OpenCV深度学习人脸识别的方法示例)
- python opencv图像合并(Python3+OpenCV2实现图像的几何变换平移、镜像、缩放、旋转、仿射)
- opencv轮廓模糊识别(Opencv+Python实现图像运动模糊和高斯模糊的示例)
- opencv提取图像轮廓python代码(Python基于opencv调用摄像头获取个人图片的实现方法)
- opencv图像识别基础知识(opencv与numpy的图像基本操作)
- opencv人脸识别实战(Python opencv实现人眼/人脸识别以及实时打码处理)
- linux安装opencv版本(详解ubuntu安装opencv的正确方法)
- AMD YES A卡还是N卡 A卡和N卡的区别(AMDYESA卡还是N卡)
- 以后显卡多了一个新选择,N卡和A卡外又多了个I卡(以后显卡多了一个新选择)
- 读卖乐园的彩灯(读卖乐园的彩灯)
- 新疆80后在淘宝卖干果 以前是 不务正业 如今帮乡亲致富(新疆80后在淘宝卖干果)
- 弄清楚了销 售 买 卖这四个字,母婴生意做起来就没那么难了(弄清楚了销售买)
- 数读 买首饰金是 投资黄金 吗 买金容易卖金难(数读买首饰金是)
热门推荐
- 怎么用腾讯云主机搭建网站(用云主机怎么搭建网站?云主机建网站完整流程)
- 以双斜杠//开头的URL的含义
- dedecms文章标题(dedecms5.7后台发布文章提示“标题不能为空”的解决方法)
- mssql 存储过程查询语句(MSSQL分页存储过程完整示例支持多表分页存储)
- 登录宝塔面板无法显示网站(宝塔bt面板如何设置自定义404错误页面)
- jscanvas背景色(JavaScript canvas实现代码雨效果)
- docker 容器移植(Docker构建kubectl镜像的实现步骤)
- jquery鼠标滑过显示提示框
- mysql主从复制如何解决延迟(MySQL 8.0.23中复制架构从节点自动故障转移的问题)
- node中如何用import(分析node事件循环和消息队列)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9