千家信息网

opencv与numpy图像的基本操作方法是什么

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,本文小编为大家详细介绍"opencv与numpy图像的基本操作方法是什么",内容详细,步骤清晰,细节处理妥当,希望这篇"opencv与numpy图像的基本操作方法是什么"文章能帮助大家解决疑惑,下面跟
千家信息网最后更新 2025年11月07日opencv与numpy图像的基本操作方法是什么

本文小编为大家详细介绍"opencv与numpy图像的基本操作方法是什么",内容详细,步骤清晰,细节处理妥当,希望这篇"opencv与numpy图像的基本操作方法是什么"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

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 cv2import numpy as npimg = cv2.imread("test.jpg")print(img.shape)roiTest = img[475:525, 0:50]img[0:50, 0:50] = roiTestcv2.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") 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.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()

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

读到这里,这篇"opencv与numpy图像的基本操作方法是什么"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

图像 像素 通道 数据 边框 方法 基本操作 坐标 尺寸 类型 函数 文章 版本 相同 两个 内容 参数 可以通过 大小 效率 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 java搭建内网穿透服务器 计算机软件开发公司的成本 宝山区创新数据库报价行情 淮安新品联想服务器维修电话 万网服务器安全控制台 网络技术安全培训班 数据库时间段怎么写 企业服务器机器每天会关机吗 烟草网络安全管理 我的世界免费模组服务器 七大主流数据库名称 经纬度写入数据库怎么写 铁锈战争怎么进官方服务器 嘉兴企业软件开发管理 php搜索数据库设计 asp 数据库值赋给变量 商海导航服务管理器连不上服务器 网络安全的事例与分析 access数据库调用 养殖管理服务器 钉钉打卡机无法连接到服务器 刀片服务器开机 海康威视流媒体服务器硬件要求 如何替换数据库中文字符串 创建图书馆数据库和我的数据库 数据库表数据改不了怎么办 复制数据库创建包错误 数据库统计不及格人数超过十人 软件开发模式特点 工控数据库安全解决
0