在 Python 中使用 OpenCV 模块对图像进行基本操作

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达
91d915569db37e49c8b7875ee879d4b8.jpeg

问题陈述

📌 使用 Python 代码自己创建图像

📌 拍摄 2 张图像,裁剪两张图像的一部分并交换它们。

📌 拍摄 2 张图像并将其组合成一张图像。例如,拼贴

因此,在本文中,我们将了解如何使用Python中的OpenCV模块创建图像、截取 2 张图像、交换它们并组合两张图像以形成单个图像。

图像处理

图像处理是一种对图像执行某些操作的方法,以获得增强的图像或从中提取一些有用的信息。图像处理是对数字化图像的分析和处理,尤其是为了提高其质量。

python中的OpenCV模块是什么?

OpenCV是一个用于计算机视觉、机器学习和图像处理的大型开源库。OpenCV 支持多种编程语言,如 Python、C++、Java 等。它可以处理图像和视频以识别物体、面部甚至人类的笔迹。OpenCV解决了很多应用,其中一些是人脸和物体识别,视频/图像搜索和检索,电视频道广告识别和街景图像拼接。

安装和导入包

  1. 从这里下载 Anaconda 的个人版:https://www.anaconda.com/products/individual

  2. 在 python 中安装NumPyOpenCV-Python模块。

pip install numpy
pip install opencv-python

704e0ebe0459c89c05313a54fa019d8c.png

  1. 在python代码中导入上述模块

import numpy
import cv2

使用 Python 代码创建图像

OpenCV - Python是一个Python库,旨在解决计算机视觉问题。cv2是它提供许多方法来操作图像的模块之一。cv2模块具有许多有助于读取和操作图像的功能。NumPy在python中支持绘制各种形状。

代码:

img = numpy.zeros((512,512,3))
# Writing text
font = cv2.FONT_HERSHEY_SIMPLEX
img = cv2.putText(img, 'Image Creation', (50, 50),font, 0.8, (0,255,255), 2)
# Creating a Rectangles
img = cv2.rectangle(img,(12,12),(312,312),(255,255,0),3)
img = cv2.rectangle(img,(100,100),(400,400),(0,255,0),3)
img = cv2.rectangle(img,(200,200),(500,500),(255,0,255),3)
img = cv2.rectangle(img,(300,300),(600,600),(5,200,2),3)
img = cv2.rectangle(img,(500,500),(600,600),(150,0,25),3)
# Creating a Circle
img = cv2.circle(img, (200, 200), 80, (255, 0, 0), 3)
# Allows us to see image
cv2.imshow("myimage",img)
cv2.waitKey(10000)
# Until closed forcefully
cv2.destroyAllWindows()

输出:

e84499aff8f2974300d11a7c2445be58.png

读取 2 张图像,裁剪这两张图像的一部分并交换它们

step 1:导入cv2,可以观察到两张图。

cv2.imread()方法从指定文件加载图像。

cv2.imshow()方法用于在窗口中显示图像。

cv2.waitkey()会等待 x 毫秒来等待 OpenCV 窗口上的按键。

cv2.destroyAllWindows()简单地破坏我们创建的所有窗口。

import cv2
#Allows us to read a image1
img1 = cv2.imread("1.jpg")
# Allows us to see image1
cv2.imshow("FirstImage",img1)
cv2.waitKey(10000)
# Until closed forcefully
cv2.destroyAllWindows()

输出:

a8225431b41f11ce931cf8d42d87569a.png

#Allows us to read a image2
img2 = cv2.imread("2.jpg")
# Allows us to see image2
cv2.imshow("SecondImage",img2)
cv2.waitKey(10000)
# Until closed forcefully
cv2.destroyAllWindows()

输出:

ee851ff4ca994d301e96dfe6751c44da.png0e0971439b8e168359b3da6e5724a0a1.png

调整大小之前

Step2:“resize”两张图片的维度不一样,我们可以通过cv2模块中的方法来改变。

#Allows us to resize a image1
new_img1 = cv2.resize(img1,(900,512))
# Allows us to see new_image1
cv2.imshow("NewFirstImage",new_img1)
cv2.waitKey(10000)
# Until closed forcefully
cv2.destroyAllWindows()#Allows us to resize a image2
new_img2 = cv2.resize(img2,(900,512))
# Allows us to see new_image2
cv2.imshow("NewSecondImage",new_img2)
cv2.waitKey(10000)
# Until closed forcefully
cv2.destroyAllWindows()

调整大小后两个图像的尺寸相同。

1b86611d5ec90387f36b39eacad755c8.png

调整大小后

第 3 步:为了裁剪图像,我们使用以下代码

crop_img1=new_img1[0:200,0:200]
# Allows us to see crop_image1
cv2.imshow("CroppedFirstImage",crop_img1)
cv2.waitKey(10000)
# Until closed forcefully
cv2.destroyAllWindows()

1876f17de0c20f81dd5f7b8d5d876c77.png

crop_img2=new_img2[0:200,0:200]
# Allows us to see crop_image2
cv2.imshow("CroppedSecondImage",crop_img2)
cv2.waitKey(10000)
# Until closed forcefully
cv2.destroyAllWindows()

b63aee9ec6de6f7221e8344403a527f2.png

step4:为了用图像交换那些裁剪的部分,我们使用以下代码

swap_img1=crop_img2
new_img1[200:400,200:400]=swap_img1
# Allows us to see new_image1 after swapping
cv2.imshow(“SwappedFirstImage”,new_img1)
cv2.waitKey(10000)
# Until closed forcefully
cv2.destroyAllWindows()

ee896b27409e8923cdbc43675860988e.png

用 SecondImage 的裁剪部分交换第一张图像

正如我们所知,我们不能在Python中将变量或值声明为常量。由于python变量是引用,我们有效地传递了引用的副本。

因此,如果我们将图像作为变量传递,并且不改变它,它实际上是“像”一个常量一样传递。但是在交换第一张图像时,我们会更改变量,因此在使用裁剪部分交换第二张图像时,我们必须再次执行步骤 2、3、4。

swap_img2=crop_img1
new_img2[200:400,200:400]=swap_img2
# Allows us to see new_image2 after swapping
cv2.imshow(“SwappedSecondImage”,new_img2)
cv2.waitKey(10000)
# Until closed forcefully
cv2.destroyAllWindows()

用 FirstImage 的裁剪部分交换第二张图像

e487150337e3e2e12d1f370a4bc6f21e.png

读取 2 个图像,并将它们组合成一个图像。

例如:拼贴画

NumPy在 python 中有一个名为的模块,它支持拼贴/组合图像。在这里,这两个图像是使用hstack()拼贴/组合的,numpy 支持图像的水平组合。

import cv2
import numpy
#Allows us to read a image1
img1 = cv2.imread(“1.jpg”)
#Allows us to read a image2
img2 = cv2.imread(“2.jpg”)
new_img1 = cv2.resize(img1,(600,512))
new_img2 = cv2.resize(img2,(600,512))
horizontal_collage = numpy.hstack((new_img1,new_img2))
# Allows us to see image1
cv2.imshow(“Horizontal Collage”,horizontal_collage)
cv2.waitKey(10000)
# Until closed forcefully
cv2.destroyAllWindows()

2c31b43495bef92bec22fd5ea80ff46a.png

水平组合图像

vstack() 用于图像的垂直组合。

import cv2
import numpy
#Allows us to read a image1
img1 = cv2.imread("1.jpg")
#Allows us to read a image2
img2 = cv2.imread("2.jpg")
new_img1 = cv2.resize(img1,(300,400))
new_img2 = cv2.resize(img2,(300,400))
vertical_collage = numpy.vstack((new_img1,new_img2))
# Allows us to see vertical_collage
cv2.imshow("Vertical Collage",vertical_collage)
cv2.waitKey(10000)
# Until closed forcefully
cv2.destroyAllWindows()

c57408955be4e33323c006c75bb06c0b.png

垂直组合图像

结论

在本文中,我们看到了一些基本操作:如何创建、读取和调整图像大小、裁剪图像的某些部分并交换它们、水平或垂直组合两个图像。

在 python 中,有许多强大的库可以使图像处理变得容易,例如OpenCV, SciKit-ImagePillow.``NumPy 是 Numeric 和 Numarray 的扩展。可以使用NumPy函数执行各种图像处理。

使用此链接访问此处使用的所有代码:https://github.com/sakshijadhav92/Image_Processing.git

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值