从零开始学cv-2:图像处理入门(上)


一,简介

在数字时代,图像处理已成为计算机科学和多媒体技术领域中的一个重要分支。无论是对于科学研究、工业生产还是日常生活,图像处理技术都扮演着至关重要的角色。本篇文章旨在带领初学者走进图像处理的世界,重点介绍图像处理的基础知识,包括图像像素赋值、图像创建,以及图像拼接、裁剪与缩放,图像通道拆分与合并,图像二值化,图像轮廓查找等图像的基本操作。通过这些入门知识的学习,读者将能够更好地理解和掌握图像处理的基本原理,为后续的深入研究和实际应用打下坚实的基础。接下来,让我们逐一探讨这些关键概念和技术,开启图像处理的探索之旅。

一、图像创建:

在很多情况下读取已经存在的图片是不足以完成项目需求的,比如说创建一个蒙版用来选择所需的roi区域,这个时候我们就需要从零开始创建一个新图像。
OpenCV中的图像数据结构采用ndarray多维数组形式,因此我们可以利用Numpy库轻松创建多维数组以生成图像。尤其是在生成黑色、白色或随机图案的特殊图像时,使用Numpy进行图像创建显得尤为便捷。方法说明:

numpy.empty(shape, dtype]) # 返回一个指定形状和类型的空数组
numpy.zeros(shape, dtype]) # 返回一个指定形状和类型的全零数组
numpy.ones(shape, dtype) # 返回一个指定形状和类型的全一数组
numpy.empty_like(img) # 返回一个与图像 img 形状和类型相同的空数组
numpy.zeros_like(img) # 返回一个与图像 img 形状和类型相同的全零数组
numpy.ones_like(img) # 返回一个与图像 img 形状和类型相同的全一数组

二、图像像素赋值

图像像素是组成数字图像的基本单元,每个像素包含颜色和亮度信息。它们按照行列坐标排列,共同决定了图像的分辨率和显示细节。像素的数量和密度影响图像的清晰度。
通过OpenCV库读取的图像数据以Numpy矩阵的形式存在,其中矩阵的每个元素对应图像中的一个像素。矩阵的维度反映了图像的通道数量,例如,一个三维矩阵代表了一个包含红、绿、蓝三个颜色通道的彩色图像。每个矩阵元素的数值则表示对应像素点的亮度或颜色值。若要编辑图像,我们可以通过Numpy的方法对矩阵进行赋值,这样的操作将直接反映在图像上,表现为改变特定像素点的颜色,进而实现图像编辑的效果。
例子:

import cv2
imgFile = r"D:\pythonProject\13.jpg"  # 读取文件的路径
img = cv2.imread(imgFile)
img1 = img.copy()  # 获取图像的复制
img1[img1 < 20] = 255   # 将图像img1中像素值小于20的值赋值为255
cv2.imshow("img1", img)  # 显示图像1
cv2.imshow("img2", img1)  # 显示图像2
cv2.waitKey(0)

效果:
在这里插入图片描述

三,图像拼接:

图像拼接是指将多张具有重叠区域的图像通过特定的算法和技术手段,合成一张宽视角或高分辨率的完整图像的过程。这一技术常用于遥感、摄影测量、计算机视觉等领域,以扩大视野范围或提高图像的细节表现。拼接过程中,需要对图像进行预处理、特征提取、配准和融合等步骤,以确保拼接后的图像自然、无缝且信息完整。
numpy实现为:

numpy.hstack()(水平堆叠):
作用:将一系列数组沿水平方向(列方向)堆叠成一个新数组。
参数:接受一个由数组组成的序列(如列表或元组),所有数组需要在除了要堆叠的维度之外的其他维度上具有相同的形状。
返回值:返回一个新的数组,其中输入的数组被水平堆叠。
numpy.vstack()(垂直堆叠):
作用:将一系列数组沿垂直方向(行方向)堆叠成一个新数组。
参数:与 hstack() 类似,接受一个由数组组成的序列,所有数组需要在除了要堆叠的维度之外的其他维度上具有相同的形状。
返回值:返回一个新的数组,其中输入的数组被垂直堆叠。

例子:

import cv2
import numpy

imgFile1 = r"D:\pythonProject\1.jpg"  # 读取文件的路径
imgFile2 = r"D:\pythonProject\2.jpg"
img1 = cv2.resize(cv2.imread(imgFile1), (480,480)) # 将图像裁剪为(480,480)大小
img2 = cv2.resize(cv2.imread(imgFile2), (480,480))# 将图像裁剪为(480,480)大小
img_h = numpy.hstack((img1, img2)) # 水平拼接
img_v = numpy.vstack((img1, img2)) # 垂直拼接

cv2.imshow("img_h", img_h)  # 显示图像1
cv2.imshow("img_v", img_v)  # 显示图像2
cv2.waitKey(0)

效果:
水平拼接:
在这里插入图片描述
垂直拼接:
在这里插入图片描述

四,图像缩放

图像缩放是通过调整尺寸来放大或缩小图像,涉及像素重采样和生成新图像,用于适应不同显示需求、优化存储和增强视觉效果。我们可以通过opencv的内置函数cv2.resize()来简单实现图像缩放。

cv2.resize(src,dsize,fx,fy,interpolation)函数在OpenCV中用于调整图像的大小。以下是该函数的参数:
src: 输入图像,通常是使用cv2.imread()加载的图像。
dsize: 输出图像的大小。如果这个参数为0,那么它将通过下面的fx和fy参数来确定。
fx: 沿水平方向的缩放比例。
fy: 沿垂直方向的缩放比例。
如果fx=0.4,fy=0.6,则将原图片的x轴缩小为原来的0.4倍,将y轴缩小为原来的0.6倍,注意:如果要使用fx,fy缩放图像 输出图像的大小dsize填写(0,0)
interpolation: 用于图像缩放的插值方法。以下是一些常用的插值方法:
cv2.INTER_NEAREST: 最近邻插值
cv2.INTER_LINEAR: 双线性插值(默认值)
cv2.INTER_AREA: 使用像素区域关系进行重采样(适合缩小图像)
cv2.INTER_CUBIC: 双三次插值(适用于放大图像)
cv2.INTER_LANCZOS4: Lanczos插值(适用于放大图像)

例子:

import cv2
width = 256
height = 256
img = cv2.imread(r'D:\pythonProject\1.jpg')

# 两种常用的缩放方式,直接缩放到目标大小以及分别控制xy轴缩放比例
img1 = cv2.resize(img, (width, height)) # 将图像缩放到256*256
img2 = cv2.resize(img, (0, 0), fx=0.2, fy=0.2)  # 将图像按x缩小至原来的0.2倍y轴缩小至原来的0.2倍

cv2.imshow("img1", img2)
cv2.imshow("img2", img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

五,图像剪裁

图像裁剪是从原始图像中提取出感兴趣区域的操作,通过指定裁剪的起始坐标和裁剪区域的大小来实现。裁剪后的图像是原始图像的一个子集,保留了指定区域的像素信息,而其他部分则被排除在外。
图像裁剪可以通过Numpy的切片功能来实现。例如,使用img[y:y+h, x:x+w].copy()这样的语法,可以直接从图像img中裁剪出从坐标(y, x)开始,高度为h、宽度为w的区域。需要注意的是,在裁剪时要使用.copy()方法。如果不使用.copy(),对裁剪得到的图像进行的任何操作都会影响到原始图像。使用.copy()相当于进行了深拷贝,从而获得一个独立的图像副本,避免了对原图的不必要修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值