【计算机视觉处理3】图像基本处理

简介: 在前面我们了解到opencv中的图像实际上就是一个ndarray数组,我们对ndarray数组进行操作就是对图像进行操作。我们先来看一下切片查找,这是我们非常常用的一个操作。

图像基本处理

1、图像切片

在前面我们了解到opencv中的图像实际上就是一个ndarray数组,我们对ndarray数组进行操作就是对图像进行操作。我们先来看一下切片查找,这是我们非常常用的一个操作。

(1)一维数组的切片

我们来看看切片的语法,对于一维的数组我们可以通过下面的操作获取第0个到第4个元素:

array[0:5]
复制代码

从上面可以知道我们的切片操作是左闭右开的。上面的切片操作我们可以简写一下:

array[:5]
复制代码

如果我们没有设置第一个值,则表示从头开始切片。当然我们还可以省略第二个值,这时含义就是取到最后一个元素,比如下面的操作:

array[3:]
复制代码

我们用一个实际的例子来看看切片操作:

import numpy as np
# 创建一个一维的ndarray数组,数据为[0, 1, 2, 3, 4, 5, 6, 7]
array = np.array([0, 1, 2, 3, 4, 5, 6, 7])
# 取0到4个元素
print(array[0:5])
print(array[:5])
# 取第3个到最后一个元素
print(array[3:])
复制代码

输出内容如下:

[0 1 2 3 4]
[0 1 2 3 4]
[3 4 5 6 7]
复制代码

我们可以把切片操作总结为:

# 左闭右开
array[start: end-1]
复制代码

当我们以第0个开始,获取以最后一个结尾的话,对应的值是可以省略的。

(2)二维数组的切片

在图像处理中,我们更关注二维数组的切片。它的语法和一维数组很相似。为了方便理解,我们直接使用图片来进行切片,比如下面这张图片:

网络异常,图片无法展示
|

二维数组切片的语法如下:

array[start:end-1, start:end-1]
复制代码

现在我们需要明确一点,左边部分是对高的截取,右边部分是对宽的截取。那现在我要截取图片的左半部分的操作应该如下:

import cv2
# 读取图片
img = cv2.imread('xyql.jpg')
# 获取图片的宽,并除2
width = img.shape[1]//2
# 对图片进行切片,截取左半部分
left = img[:, :width]
# 显示图像三步骤
cv2.imshow('left', left)
cv2.waitKey(0)
cv2.destroyAllWindows()
复制代码

其中切片的代码是:

left = img[:, :width]
复制代码

左边的是截取高,我们需要全部截取,因此两个值都可以省略。右边我们只需要截取左半部分,因此左边的值可以省略,右边的值则是我们前面计算到的宽度。下面是效果图:

网络异常,图片无法展示
|

这里需要注意一点,彩色图像其实是三维的,但是我们没有操作第三个维度。

2、图片区域替换

既然我们知道如何切片,那我们就可以对指定区域进行替换。不过需要注意替换和被替换的区域形状要相同,即shape属性要一样。比如我要把图片左上角100*100的区域替换成白色,那我可以进行如下操作:

import cv2
import numpy as np
img = cv2.imread('1.jpg')
# 创建一个100*100的白色图像
replace_img = np.ones((100, 100), dtype=np.uint8)*255
# 将图片左上角100*100区域替换
img[:100, :100] = replace_img
复制代码

运行后会发现报了如下错误:

img[:100, :100] = replace_img
ValueError: could not broadcast input array from shape (100,100) into shape (100,100,3)
复制代码

它的意思是不能将(100, 100)的图像转换成(100, 100, 3)的图像,也就是形状不匹配。在替换时我们需要特别注意这一点,我们将上面的代码进行一些修改:

import cv2
import numpy as np
img = cv2.imread('xyql.jpg')
replace_img = np.ones((100, 100, 3), dtype=np.uint8)*255
img[:100, :100] = replace_img
复制代码

*这样我们就可以成功替换了,效果如下:

网络异常,图片无法展示
|

其实用上面的操作我们可以实现一个“双胞胎”效果,下面我们就来看看吧。

3、实现“双胞胎”效果

我们先准备两张图片,保证相机在没有移动的情况下拍两张图片,比如下面两张:

网络异常,图片无法展示
|

这是我刚拍的两张图片,因为相机没有移动,所以背景应该是一样的。我们可以通过下面的代码把两个梦幻合并到一张图片上:

import cv2
# 读取两张图片
img1 = cv2.imread('mh1.JPG')
img2 = cv2.imread('mh2.JPG')
# 求出宽的中间值
mid = img1.shape[1]//2
# 把mh2的右半边替换到mh1的右半部分
img1[:, mid:] = img2[:, mid:]
# 将拼接后的图片保存到本地
cv2.imwrite('result.jpg', img1)
复制代码

上面代码非常简单,我们只需要关注下面这句:

img1[:, mid:] = img2[:, mid:]
复制代码

img1和img2的shape都是一样的,截取的区域也是一样的,所以进行替换没有上面问题。最后我们通过:

cv2.imwrite('result.jpg', img1)
复制代码

对图片进行保存。因为我们是直接对img1进行操作,因此我们直接保存img1就好了。下面是我们的效果图:

网络异常,图片无法展示
|

这里需要多说一句,我只有一个梦幻。

4、numpy生成数组

在上一篇中我们使用下面的代码生成了一个数组:

im = np.zeros((3, 3, 1), dtype=np.uint8)
复制代码

对于数组numpy来说我们是生成一个数组,但是对opencv来说是生成一张图片。下面我们来看看numpy生成数组的一些操作。

(1)np.ones

我们可以通过numpy的ones函数生成一个元素全为1的数组,比如下面的代码:

np.ones((100, 100), dtype=np.uint8)
复制代码

ones接收两个参数,第一个参数是数组的shape,第二关则是数组元素的类型,其中np.uint8表示【无符号的8位整型】,即范围在(0-255)之间。我们可以用opencv显示一下上面的图片:

import cv2
import numpy as np
# 生成一个100*100的图片,每个元素的值都为1
img = np.ones((100, 100), dtype=np.uint8)
cv2.imwrite('result.jpg', img)
复制代码

效果图如下:

网络异常,图片无法展示
|

因为1很接近0,所以图片的颜色接近于黑色。我们可以通过下面的操作对每个元素进行操作:

import cv2
import numpy as np
img = np.ones((100, 100), dtype=np.uint8) * 127
cv2.imwrite('result.jpg', img)
复制代码

我们生成元素为1的数组后,如何进行乘127的操作,这样就可以对每个元素进行乘127操作。这时候数组的每个元素都是127,下面是显示效果:

网络异常,图片无法展示
|

当然我们的图片是二维的,对opencv来说是一个灰度图。如果想要生成一个彩色图像,我们可以生成一个三维的图像,后续我们会继续讲解。

(2)np.zeros

np.zeros和ones没有上面区别,只是它元素的内容是0。我们来简单看一下:

import numpy as np
img = np.zeros((5, 5), dtype=np.uint8)
print(img)
复制代码

为了方便看,我们直接生成一个简单的数组,输出结果如下:

[[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
复制代码

其它的都不再细说了。

目录
相关文章
|
30天前
|
机器学习/深度学习 人工智能 算法
探索深度学习在图像识别中的应用
【2月更文挑战第29天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉领域前进的关键力量。本文旨在探讨深度学习技术在图像识别任务中的应用及其带来的变革。我们将从卷积神经网络(CNN)的基础结构出发,分析其在图像处理中的优势,并深入讨论几种改进的深度学习模型,如循环神经网络(RNN)和生成对抗网络(GAN)。此外,本文还将评估深度学习在解决实际问题时面临的挑战,以及未来研究的可能方向。
10 1
|
1天前
|
机器学习/深度学习 算法 计算机视觉
深度学习在图像识别中的应用与挑战
【4月更文挑战第18天】 随着人工智能技术的飞速发展,深度学习在图像识别领域取得了显著的成果。本文将探讨深度学习在图像识别中的应用,分析其优势和面临的挑战。我们将重点关注卷积神经网络(CNN)在图像识别中的关键作用,以及如何通过优化算法和模型结构来提高识别准确率。此外,我们还将讨论数据增强、迁移学习等技术在图像识别中的应用,以及如何解决数据不平衡、过拟合等问题。最后,我们将展望深度学习在图像识别领域的未来发展趋势。
3 0
|
12天前
|
机器学习/深度学习 监控 自动驾驶
深度学习在图像识别中的应用及挑战
【4月更文挑战第7天】随着人工智能技术的不断发展,深度学习已经成为计算机视觉领域的核心驱动力。本文旨在探讨深度学习技术在图像识别中的应用及其面临的挑战。首先,我们将介绍深度学习的基本原理和关键技术,然后分析其在图像识别领域的应用,最后讨论当前技术发展所面临的主要挑战。
|
12天前
|
机器学习/深度学习 人工智能 监控
探索深度学习在图像识别中的应用及挑战
【4月更文挑战第7天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉领域进步的核心动力。本文旨在深入剖析深度学习技术在图像识别任务中的应用及其所面临的诸多挑战。首先,我们将回顾深度学习的基本原理和关键技术,特别是卷积神经网络(CNN)在图像处理中的作用。其次,文章将探讨当前深度学习模型在图像识别领域的创新应用,包括面部识别、物体检测、场景理解等方面。最后,我们将分析深度学习在图像识别上遇到的挑战,如数据集偏差、模型泛化能力、对抗性攻击等,并对未来可能的解决方案进行展望。本文不仅为研究者提供了深度学习在图像识别方面的研究进展,也为相关领域的实践者指出了潜在的问题与发展方向。
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
计算机视觉
计算机视觉
15 2
|
1月前
|
机器学习/深度学习 监控 自动驾驶
深度学习在图像处理中的应用探索
【2月更文挑战第13天】本文旨在探讨深度学习技术在图像处理领域的应用及其带来的变革。不同于传统的摘要方式,这里我们采用问题引导式的方法来概述全文:深度学习如何改变了图像处理的面貌?它在图像分类、检测与识别中扮演了什么角色?深度学习技术的未来发展方向又是怎样的?通过对这些问题的探讨,文章旨在为读者提供一个关于深度学习在图像处理领域应用的全面视角,同时也对该技术面临的挑战和未来的可能性进行了展望。
|
1月前
|
机器学习/深度学习 监控 自动驾驶
深度学习在图像识别中的应用探索
【2月更文挑战第13天】 本文从一个独特的视角出发,探讨了深度学习技术在图像识别领域的应用与发展。文章首先简要回顾了深度学习的基本原理和图像识别的基础知识,接着通过实际案例分析,阐述了深度学习技术如何有效提高图像识别的准确性和效率。文章不仅介绍了当前深度学习在图像识别中的主要技术挑战,还展望了未来的发展方向,为读者提供了一种全新的理解视角和思考深度学习在图像识别应用中的可能性。
13 3
|
1月前
|
机器学习/深度学习
深度学习在图像识别中的应用及其挑战
【2月更文挑战第16天】 随着科技的发展,深度学习已经在各个领域中发挥了重要的作用,特别是在图像识别领域。本文将探讨深度学习在图像识别中的应用,以及在实际应用中遇到的挑战。我们将详细介绍深度学习的基本原理,以及如何将其应用于图像识别。此外,我们还将讨论在实际应用中可能遇到的问题,如数据不平衡、模型过拟合等,并提出相应的解决方案。
13 2
|
3月前
|
机器学习/深度学习 算法 TensorFlow
面向计算机视觉的深度学习:1~5(4)
面向计算机视觉的深度学习:1~5(4
|
7月前
|
机器学习/深度学习 PyTorch TensorFlow
深度学习在图像分类中的应用
随着人工智能技术的不断发展,深度学习作为其中的重要组成部分,已经在许多领域取得了突破性的进展。本文将重点介绍深度学习在图像分类任务中的应用,并通过一个示例来展示其强大的能力。
165 0