OpenCV的操作

1.图像的基本操作

1.1读取图像

image_handler = cv2.imread(image_path, cv2.IMREAD_COLOR)

第一个参数图片的存储路径,第二个参数是图像的读取方式

第二个参数有三个选项:

  • cv2.IMREAD_UNCHANGED:保持原格式不变,-1;
  • cv2.IMREAD_COLOR:以灰度模式读入图片,可以用0 表示;
  • cv2.IMREAD_GRAYSCALE,1:,读入一副彩色图片,可以用1 表示;默认值

 1.2. 获取照片尺寸

        照片的shape属性会返回一个包含三个元素的元组:(高,宽,图像通道数量),所以用读取元组元素的方式来获取照片尺寸

img_high = image_handler.shape[0]
img_width = image_handler.shape[1]

1.3. 像素操作

图片是由一系列像素点组成的,而读取的图片数据是以二维数组来存储的,因此我们可以通过读取数组的元素来获取某一个像素点的数据,然后进行编辑。

    # 获取坐标(100,100)这个像素点的bgr数据(b,g,r) = image_handler[100,100]

下面的例子是将图片中的[0,200]和[0,100]的范围变成白色

    image_path = "./resource/red_light.png"# 图像数据以二维数组的形式存储在image_handler中image_handler = cv2.imread(image_path, cv2.IMREAD_COLOR)# 获取照片尺寸img_high = image_handler.shape[0]img_width = image_handler.shape[1]print(img_high, img_width)i=j=0for i in range(1, 200):image_handler[i,j] = (255, 255, 255)for j in range(1, 100):image_handler[i, j] = (255, 255, 255)cv2.imshow('image', image_handler)cv2.waitKey(0)cv2.destroyAllWindows()

结果为

2. 图像的几何变换

2.1 图片缩放

cv2.resize(InputArray src, OutputArray dst, Size, fx, fy,interpolation)

参数含义:

InputArray输入图片
OutputArray输出图片
Size输出图片尺寸
fx, fy沿x 轴,y 轴的缩放系数
interpolation插入方式

其中interpolation 选项所用的插值方法:

INTER_NEAREST最近邻插值
INTER_LINEAR双线性插值(默认设置)
INTER_AREA使用像素区域关系进行重采样
INTER_CUBIC像素邻域的双三次插值
INTER_LANCZOS4像素邻域的Lanczos 插值
# 图像数据以二维数组的形式存储在image_handler中image_handler = cv2.imread(image_path, cv2.IMREAD_COLOR)# 获取照片尺寸img_high, img_width = image_handler.shape[0:2]print(img_high, img_width)# 将图像缩小至原来的二分之一image_handler_resize = cv2.resize(image_handler,(img_high//2, img_width//2))# 显示缩放后的图像cv2.imshow("resize_image",image_handler_resize)# 最近邻插值法缩放到原来的四分之一#resize第二个参数(0,0)表示缩放后的尺寸,(0,0)表示按缩放后的比例显示,#若不为(0,0),比如为(100,100)则缩放后按指定尺寸(100,100)显示image_handler_test1 = cv2.resize(image_handler,(0,0),fx=0.25,fy=0.25,interpolation=cv2.INTER_NEAREST) cv2.imshow("resize_1/4",image_handler_test1)print(image_handler_test1.shape[:2])# 显示原图像cv2.imshow('image', image_handler)cv2.waitKey(0)cv2.destroyAllWindows()

2.2 图片剪切

    # 图像数据以二维数组的形式存储在image_handler中image_handler = cv2.imread(image_path, cv2.IMREAD_COLOR)# 获取照片尺寸img_high, img_width = image_handler.shape[0:2]print(img_high, img_width)# 图片的剪切,注意剪切的分辨率不要超过图片原有的分辨率image_cut = image_handler[100:200, 100:200] # 剪切像素点100到200的图片内容# 显示剪切后的图片cv2.imshow("cut_image", image_cut)# 显示原图像cv2.imshow('image', image_handler)cv2.waitKey(0)cv2.destroyAllWindows()

运行结果:

2.3 图片平移

图片的数据是通过二维矩阵的形式存储的,因此可以用矩阵的平移来完成图片的平移

目前图片和原图片的对应关系是:

dst(x,y) = src(M_{11}x+M_{12}y+M_{13},M_{21}x+M_{22}y+M_{23})

对应的变换矩阵是

\begin{bmatrix} M_{11} & M_{12} &M_{13} \\ M_{21}&M_{22} &M_{23} \end{bmatrix}

公式里M_{11},M_{21}是按x轴和y轴方向缩放系数,在图片平移的情况里这两个参数均为1

若将图片src向右侧移动200像素,向下移动100个像素点,那么对应的变换矩阵是

\begin{bmatrix} 1 & 0 & 200\\ 0 & 1& 100 \end{bmatrix}

代码实现为:

    # 图像数据以二维数组的形式存储在image_handler中image_handler = cv2.imread(image_path, cv2.IMREAD_COLOR)# 获取照片尺寸img_high, img_width = image_handler.shape[0:2]print(img_high, img_width)# 实现转换矩阵matShift = np.float32([[1,0,200],[0,1,100]])# 平移图片image_move = cv2.warpAffine(image_handler,matShift,(img_high,img_width))# 显示平移后的图片cv2.imshow("image_move", image_move)# 显示原图像cv2.imshow('image', image_handler)cv2.waitKey(0)cv2.destroyAllWindows()

运行结果: 

 

2.4 图片镜像

        图片镜像分水平镜像和垂直镜像。水平镜像以图像垂直中线为轴,将图像的像素进行对换,也就是将图像的左半部和右半部对调。垂直镜像则是以图像的水平中线为轴,将图像的上半部分和下半部分对调。

        镜像的算法比较简单,以水平镜像为例子,假设下图为图像的像素点阵列:(x0,y0)为原图的像素坐标,(a0,y0)为水平镜像后的像素坐标。以第一个像素点(x0,y0)为例子,经过镜像后的坐标为(a5,y0)。可见水平镜像是像素水平坐标发生变化,而垂直坐标没有变化。

两张照片中的所有像素点都关于垂直对称轴对称,那么镜像后的a5的像素坐标为:

a_{5}+x_{0}+1=width

a_{5} = width - x_{0}-1 

 用代码实现为:

   for i in range(0, height):for j in range(0, width):mirrorImage[i, j] = img_handler[i, width-j-1]

实现水平镜像和垂直镜像的完整代码为:

# mirror_image_vertical() 垂直翻转图像
def mirror_image_vertical():img_handler = cv2.imread(image_path, cv2.IMREAD_COLOR)img_info = img_handler.shapeheight = img_info[0]width = img_info[1]deep = img_info[2]newImginfo = (height, width, deep)mirrorImage = np.zeros(newImginfo, np.uint8)
#     将原图片填充到新图片中for i in range(0, height):for j in range(0, width):mirrorImage[i, j] = img_handler[height-i-1, j]cv2.imwrite("mirror_image_vertical.jpg", mirrorImage)cv2.imshow("mirror_image_vertical", mirrorImage)cv2.imshow("origin_image", img_handler)print("mirror image size:",mirrorImage.shape)cv2.waitKey(0)cv2.destroyAllWindows()# mirror_image_horizontal 水平翻转图像
def mirror_image_horizontal():# 读取原始图像img_handler = cv2.imread(image_path, cv2.IMREAD_COLOR)# 获取图像的高height,宽width,色深deepimg_info = img_handler.shapeheight = img_info[0]width = img_info[1]deep = img_info[2]newImginfo = (height, width, deep)# 新建一个空的图像阵列mirrorImage = np.zeros(newImginfo, np.uint8)
#     将原图片填充到新图片中for i in range(0, height):for j in range(0, width):mirrorImage[i, j] = img_handler[i, width-j-1]cv2.imwrite("mirror_image_horizontal.jpg", mirrorImage)cv2.imshow("mirror_image_horizontal", mirrorImage)cv2.imshow("origin_image", img_handler)print("mirror image size:",mirrorImage.shape)cv2.waitKey(0)cv2.destroyAllWindows()

水平翻转结果:

垂直翻转的结果为:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/4786.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构之单链表

前言:上一篇文章我们了解到顺序表,这一次来看另一种线性表-------单链表。 1. 单链表的概念 单链表,想必很多人会感到陌生吧。那么,到底什么是单链表呢?先了解清楚单链表的概念及特性,才能够更好的实现单…

RabbitMQ死信队列

RabbitMQ死信队列 1、RabbitMQ死信队列2、代码示例2.1、队列过期2.1.1、配置类RabbitConfig(关键代码)2.1.2、业务类MessageService2.1.3、配置文件application.yml2.1.4、启动类2.1.5、配置文件2.1.6、测试 2.2、消息过期2.2.1、配置类RabbitConfig2.2.…

高亚科技签约酸动力,助力研发管理数字化升级

近日,中国企业管理软件资深服务商高亚科技与广东酸动力生物科技有限公司(以下简称“酸动力”)正式签署合作协议。借助高亚科技的8Manage PM项目管理软件,酸动力将进一步优化项目过程跟踪与节点监控,提升研发成果的高效…

Linux操作系统:学习进程_对进程的深入了解

目录 前言 开篇 一、进程概念 二、进程的描述与管理 1、如何描述与管理 2、Linux中的PCB-task_struct 3、对进程组织的理解 三、进程的属性 1、系统创建进程 2、查看进程 3、进程的标识符 4、退出进程 1>ctrlc 2>kill命令杀死进程 5、用户进程的创建方式…

大客户营销数字销售实战讲师培训讲师唐兴通专家人工智能大模型销售客户开发AI大数据挑战式销售顾问式销售专业销售向高层销售业绩增长创新

唐兴通 销售增长策略专家、数字销售实战导师 专注帮助企业构建面向AI数字时代新销售体系,擅长运用数字化工具重塑销售流程,提升销售业绩。作为《挑战式销售》译者,将全球顶尖销售理论大师马修狄克逊等理论导入中国销售业界。 核心专长&…

【Attention】ICAFusion:用于多光谱物体检测的迭代交叉注意引导的特征融合

ICAFusion: Iterative cross-attention guided feature fusion for multispectral object detection 摘要: 多光谱图像的有效特征融合在多光谱物体检测中起着至关重要的作用。以往的研究已经证明了使用卷积神经网络进行特征融合的有效性,但由于局部范围…

CSP/信奥赛C++刷题训练:经典广搜例题(2):洛谷P1135 :奇怪的电梯

CSP/信奥赛C刷题训练:经典广搜例题(2):洛谷P1135 :奇怪的电梯 题目背景 感谢 yummy 提供的一些数据。 题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电…

K8S群集调度二

一、污点(Taint) 和 容忍(Tolerations) 1.1、污点(Taint) 设置在node上是对pod的一种作用 节点的亲和性,是Pod的一种属性(偏好或硬性要求),它使Pod被吸引到一类特定的节点 而Taint 则相反,它使节点能够排斥一类特…

成都郝蓉宜恺文化传媒:引领大数据应用新篇章

在信息化浪潮汹涌的今天,大数据被誉为新时代的“石油”,正在以前所未有的速度改变着我们的生活和工作方式。成都郝蓉宜恺文化传媒,作为大数据领域的领军企业,始终站在创新的前沿,引领着大数据应用的新篇章。 作为大数…

51c自动驾驶~合集5

我自己的原文哦~ https://blog.51cto.com/whaosoft/11563178 #MapDistill 速度精度双起飞,让End2End更丝滑 在线高精(HD)地图构建是自动驾驶领域的一项重要且具有挑战性的任务。最近,人们对不依赖于激光雷达等其他传感器的基于…

如何在 SAP 中直接运行原生 SQL 语句

作为 ABAP 开发应该知道,SAP 支持在程序中运行 ABAP SQL,但是如果想要运行原生 SQL,就要借助 SQL 编辑器了。 Ps:你得向 Basis 申请权限。 SQL 编辑器允许您直接执行 SQL 语句。 1 SQL 编辑器启动方式 它可以在以下 T-code 中执…

华普微隔离芯片,赋能中国新基建之光伏创新

一、华普微隔离芯片助力光伏产业发展:现状、应用与未来展望 当前,光伏行业正深陷在无序扩张、产能过剩及激烈内卷的困境之中。为打破这种恶性竞争局面,光伏行业未来发展的“主旋律”已定调在淘汰落后产能、倡导企业兼并重组与加速技术革新步…

时隔7年,我终于考了CISSP

七年前,我开启了信息安全之旅,将 OSG 第 4 版作为敲门砖。耗费两个月时间硬着头皮读完,却如坠云雾,全然不知其深意,仅仅在脑海中隐约勾勒出一个大致的知识框架。 随后,我幸运地找到了相关工作,…

中科蓝汛GPIO操作说明

概述 本篇文章介绍如何使用中科蓝汛AB5681,GPIO管脚使用说明。 一、第一种写法 1)、GPIO配置输入模式 //内部上拉 GPIOBDE | BIT(4); //数字IO使能: 0为模拟IO, 1 为数字IO GPIOBDIR | BIT(4); //控制IO的方向: 0为输出, 1为输入. GPIOBFEN &…

RHCE 配置文件

配置文件 配置文件排错 1.1 配置基于主机名的 Web 服务器1.2 配置基于端口的 Web 服务器1.3 配置基于IP地址的 Web 服务器1.4 配置账号验证访问1.5 配置 https 加密服务1.6 课后习题 配置文件 配置文件vim里面内容时,用空格分割 #寻找配置文件 [rootlocalhost ~]# r…

笔记整理—linux驱动开发部分(8)framebuffer类设备

framebuffer显示设备。 在应用层直接抽象位向DDR中存放图片。 在操作系统中,将上图分为两个部分:驱动应用。 使用复制的方法效率十分的低,所以有了内存映射方法实现图片的显示。 framebuffer帧(铺满一个屏幕)&#xff…

智慧测绘数字化管理平台建设方案

随着信息技术的飞速发展,测绘地理信息与遥感专业正经历着一场革命性的变革。智慧测绘数字化管理平台的建设,不仅能够提高测绘数据的准确性和实时性,还能为城市规划、环境保护、灾害预防等领域提供强有力的数据支持。本文将探讨智慧测绘数字化…

conda的作用

conda是一个开源的包和环境管理系统,用于安装、管理和切换不同版本的软件包及其依赖项。它不仅支持Python,还适用于R、Ruby等多种编程语言。以下是详细介绍: 多语言支持:conda支持多种编程语言,包括但不限于Python、R、…

测试平台常见前端问题-建议收藏备忘

接下来在使用Element UI开发测试平台前端的过程中,难免会碰到各式各样的问题,因此今天我们主要整理了以下几个常见的问题和解决方案,方便各位能轻松玩转测试平台前端: Element UI更换主题颜色 拉取github资源报错问题解决 nvm管…

NC313 两个数组的交集

NC313 两个数组的交集 添加链接描述 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * param nums1 int整型ArrayList * param nums2 int整型ArrayList * return int整型A…