Python图像处理之图像增广算法详解

目录
  • 前言
  • 图像增广算法
    • a.图像旋转
    • b.图像亮度调整
    • c.图像裁剪及拼接
  • 本章小结

前言

图像增广算法在计算机视觉领域扮演着至关重要的角色。随着深度学习的兴起,大规模数据集的需求变得更加迫切,而图像增广算法可以通过对原始图像进行一系列变换,扩充数据集,从而提升模型的泛化能力和鲁棒性。

本文将着重介绍图像增广算法中的三个关键方面:图像旋转、图像亮度调整以及图像裁剪与拼接。这些算法不仅能够增加训练数据的多样性,还可以帮助我们解决一些实际问题,例如旋转不变性、光照变化以及物体完整性等。

图像增广算法

这里我们将使用一些Python优秀的第三方库来完成。在图像增广方面,有许多可供选择的第三方库,如PIL/Pillow、OpenCV、scikit-image等。而在PyTorch中也提供了一些图像增广的函数,虽然图像增广算法在PyTorch中也属于预处理的一部分,但为了方便起见,我们仍然选择使用大家较为熟悉的OpenCV库,而不使用PyTorch。

a.图像旋转

def Rotated_image(img, angle = 45, scale = 1.0):
    height, width = img.shape[:2]
    center = (width // 2, height // 2)
    matrix = cv2.getRotationMatrix2D(center, angle, scale) #旋转中心,旋转角度,缩放比例
    rotated_image = cv2.warpAffine(img, matrix, (width, height))
    return rotated_image

通过cv2.getRotationMatrix2D函数计算旋转矩阵,然后使用cv2.warpAffine函数执行旋转操作。最后,使用cv2.imshow函数显示旋转前后的图像。

实验结果: 

原始图片与旋转图片

b.图像亮度调整

def Adjusted_image(img,brightness_factor = 1.5):
    image_float = img.astype(np.float32)
    adjusted_image = image_float * brightness_factor
    # 将图像像素值限制在[0, 255]范围内
    adjusted_image = np.clip(adjusted_image, 0, 255)
    adjusted_image = adjusted_image.astype(np.uint8)
    return adjusted_image

将图像转换为浮点型数据类型。然后,通过乘以一个亮度调整因子来调整图像的亮度,这里的亮度调整因子可以根据具体需求进行调整。接下来,我们使用np.clip函数将图像像素值限制在[0, 255]范围内,避免溢出。最后,我们将图像转换回无符号8位整数类型,并显示调整后的图像。

实验结果:

原始图片与亮度调整图片

c.图像裁剪及拼接

裁剪

def Cut_image(image,coordinate, Leath, save=True, saveFile=''):
    x, y=coordinate[0],coordinate[1]
    width, height=Leath[0],Leath[1]
    h, w = image.shape[:2]
    cropped_image = image[y:y + height, x:x + width]
    padded_image = np.full((h, w, 3), 128, dtype=np.uint8)
    x_offset = (w - width) // 2
    y_offset = (h - height) // 2
    padded_image[y_offset:y_offset + height, x_offset:x_offset + width] = cropped_image
    if save:
        cv2.imwrite(saveFile,cropped_image)
    return padded_image

此功能为裁剪图像并用灰色填充不足的部分。添加了保存功能,默认不使用。

实验结果:

裁剪图像并用灰色填充

拼接

def Stitcher_image(image_paths):
    stitcher = cv2.Stitcher_create()
    images = []
    for path in image_paths:
        img = cv2.imread(path)
        if img is not None:
            images.append(img)
    if len(images) < 2:
        print('至少需要两个图像进行拼接')
        return
    (status, stitched_image) = stitcher.stitch(images)
    if status == cv2.Stitcher_OK:
        return stitched_image
    else:
        print('图像拼接失败')

输入图片路径组成的列表,数量大于等于2才可进行拼接。下图是经过裁剪后保存的图片,原图片似乎因为较小,拼接时无法成功,经过放大再裁剪后拼接,实验成功。

实验结果: 

拼接的图像

实验分析

实验图片:300x300,Leopard_cat.png

本次实验采用一张300x300大小的梅狸猫图片进行实验,并进行了图像旋转、图像亮度调整以及图像裁剪与拼接,效果均达到我的预期,在图像裁剪的过程中,因为考虑到做的是数据增广,所以添加了灰度条,保证裁剪后的图片大小与原始图片相同;拼接的图片似乎不能太小,可能会拼接失败,本实验经过图片进行放大后裁剪后拼接,实验成功。

关于拼接出现黑边的分析:

在实验过程中,我们注意到拼接后的图像边缘可能会出现一些黑边。这是由于图像拼接算法的工作原理所致,它会尝试将图像进行平滑过渡,以便在拼接处产生较少的不连续性。在一些情况下,这可能会导致边缘处的像素值略微偏暗,从而形成黑边。

虽然这些黑边可能对整体图像的观感产生一些影响,但通常情况下它们并不会严重干扰图像的内容。如果你认为黑边对你的应用场景有较大影响,您可以尝试进行后处理来减轻或消除黑边的影响。如边缘增强、图像修复或边缘填充等,来改善黑边问题。

总的来说,尽管在图像拼接过程中可能会出现一些黑边,但这并不会严重影响整体的拼接结果。通过适当的后处理方法,我们可以进一步改善图像的外观,并获得更好的拼接效果。

本章小结

本章介绍了图像处理中常见的几种操作:旋转、亮度调整、裁剪、拼接等。通过使用OpenCV和NumPy库的函数,轻松地实现了。

首先,通过cv2.getRotationMatrix2D和cv2.warpAffine函数,我们可以指定旋转中心、旋转角度和缩放比例来旋转图像。

接下来,将图像转换为浮点数类型,我们可以通过乘以亮度因子并将像素值控制在0到255之间来调整图像亮度。

然后,通过指定裁剪区域的坐标和长度,我们可以裁剪出我们需要的图像,并使用灰色填充图像的不足部分。

最后,使用cv2.Stitcher_create和stitch函数,我们可以将多张图像拼接在一起,从而创建一个更大的图像。在拼接过程中,我们需要注意边缘区域可能会有黑边的问题,可以使用图像裁剪来去除。

上述这些操作是图像处理中非常基础的操作,在实际应用中也非常常见。掌握这些基础操作后,我们可以更加轻松地实现更复杂的图像处理算法。

以上就是Python图像处理之图像增广算法详解的详细内容,更多关于Python图像增广算法的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解Python OpenCV图像分割算法的实现

    目录 前言 1.图像二值化 2.自适应阈值分割算法 3.Otsu阈值分割算法 4.基于轮廓的字符分离 4.1轮廓检测 4.2轮廓绘制 4.3包围框获取 4.4矩形绘制 前言 图像分割是指根据灰度.色彩.空间纹理.几何形状等特征把图像划分成若干个互不相交的区域. 最简单的图像分割就是将物体从背景中分割出来 1.图像二值化 cv2.threshold是opencv-python中的图像二值化方法,可以实现简单的分割功能. retval, dst = cv2.threshold(src, thresh

  • python实现图像增强算法

    本文实例为大家分享了python实现图像增强算法的具体代码,供大家参考,具体内容如下 图像增强算法,图像锐化算法 1)基于直方图均衡化 2)基于拉普拉斯算子 3)基于对数变换 4)基于伽马变换 5)  CLAHE 6)retinex-SSR 7)retinex-MSR 其中,基于拉普拉斯算子的图像增强为利用空域卷积运算实现滤波基于同一图像对比增强效果直方图均衡化:对比度较低的图像适合使用直方图均衡化方法来增强图像细节拉普拉斯算子可以增强局部的图像对比度log对数变换对于整体对比度偏低并且灰度值偏

  • Python实现RGB等图片的图像插值算法

    目录 前言 RGB彩色图像和数组理解 图片坐标对其 左对齐 中心对齐 临近插值算法 线性插值法 双线性插值 三种插值算法的综合使用 附件 前言 问题:我们在放大图片的过程中,放大的目标图像和原图图像之间会存在不同. 放大的基本思想: 第一步: 将目标图像进行缩小到原图像的尺寸,虚拟的将二者进行对重叠在一起,这样目标图像上面的像素点就和原图像上面的像素点并不是一一对应的. 第二步: 将目标图像与原图像的像素点进行建立一个映射关系,这个像素点的映射关系不是单一的像素映射,因为我们把图片存放在三维数组

  • Python实现特定场景去除高光算法详解

    目录 算法思路 应用场景 代码实现 实验效果 补充 算法思路 1.求取源图I的平均灰度,并记录rows和cols: 2.按照一定大小,分为N*M个方块,求出每块的平均值,得到子块的亮度矩阵D: 3.用矩阵D的每个元素减去源图的平均灰度,得到子块的亮度差值矩阵E: 4.通过插值算法,将矩阵E差值成与源图一样大小的亮度分布矩阵R: 5.得到矫正后的图像result=I-R: 应用场景 光照不均匀的整体色泽一样的物体,比如工业零件,ocr场景. 代码实现 import cv2 import numpy

  • Python OpenCV对图像进行模糊处理详解流程

    其实我们平时在深度学习中所说的卷积操作,在 opencv 中也可以进行,或者说是类似操作.那么它是什么操作呢?它就是图像的模糊(滤波)处理. 均值滤波 使用 opencv 中的cv2.blur(src, ksize)函数.其参数说明是: src: 原图像 ksize: 模糊核大小 原理:它只取内核区域下所有像素的平均值并替换中心元素.3x3 标准化的盒式过滤器如下所示: 特征:核中区域贡献率相同. 作用:对于椒盐噪声的滤除效果比较好. # -*-coding:utf-8-*- ""&q

  • Python实现统计图像连通域的示例详解

    目录 数组统计函数 连通域标记 连通域统计 数组统计函数 ndimage提供一系列函数,可以计算标注后的数组的相关特征,比如最值.均值.均方根等. 下列函数,如果未作其他说明,那么就有3个参数,分别是(input, labels=None, index=None),其中input为输入数组:labels为input的标签,形状和input相同:index为整数或者整数数列,为用于计算的label. 函数 物理量 函数 物理量 mean 平均值 center_of_mass 质心 maximum

  • python对DICOM图像的读取方法详解

    DICOM介绍 DICOM3.0图像,由医学影像设备产生标准医学影像图像,DICOM被广泛应用于放射医疗,心血管成像以及放射诊疗诊断设备(X射线,CT,核磁共振,超声等),并且在眼科和牙科等其它医学领域得到越来越深入广泛的应用.在数以万计的在用医学成像设备中,DICOM是部署最为广泛的医疗信息标准之一.当前大约有百亿级符合DICOM标准的医学图像用于临床使用. 看似神秘的图像文件,究竟是如何读取呢?网上随便 一搜,都有很多方法,但缺乏比较系统的使用方法,下文综合百度资料,结合python2.7,

  • OpenCV图像颜色反转算法详解

    前言 图像颜色的反转,比较简单的思路就是使用255减去当前值,从而得到反转后的图像.原始图片: 1.灰度图像的颜色反转 import cv2 import numpy as np # 灰度 0-255 255-当前灰度值 img = cv2.imread('image0.jpg', 1) imgInfo = img.shape height = imgInfo[0] width = imgInfo[1] gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) d

  • Python图像处理之图像融合与ROI区域绘制详解

    目录 一.图像融合 二.图像ROI区域定位 三.图像属性 (1)shape (2)size (3)dtype 四.图像通道分离及合并 (1)split()函数 (2)merge()函数 五.图像类型转换 六.总结 一.图像融合 图像融合通常是指多张图像的信息进行融合,从而获得信息更丰富的结果,能够帮助人们观察或计算机处理.图5-1是将两张不清晰的图像融合得到更清晰的效果图. 图像融合是在图像加法的基础上增加了系数和亮度调节量,它与图像的主要区别如下[1-3]: 图像加法:目标图像 = 图像1 +

  • Python图像处理之图像量化处理详解

    目录 一.图像量化处理原理 二.图像量化实现 三.图像量化等级对比 四.K-Means聚类实现量化处理 五.总结 一.图像量化处理原理 量化(Quantization)旨在将图像像素点对应亮度的连续变化区间转换为单个特定值的过程,即将原始灰度图像的空间坐标幅度值离散化.量化等级越多,图像层次越丰富,灰度分辨率越高,图像的质量也越好:量化等级越少,图像层次欠丰富,灰度分辨率越低,会出现图像轮廓分层的现象,降低了图像的质量.图8-1是将图像的连续灰度值转换为0至255的灰度级的过程[1-3]. 如果

  • Python图像处理之图像金字塔详解

    目录 一.图像金字塔原理 二.图像向上取样 三.图像向下取样 四.总结 一.图像金字塔原理 上一篇文章讲解的图像采样处理可以降低图像的大小,本文将补充图像金字塔知识,了解专门用于图像向上采样和向下采样的pyrUp()和pyrDown()函数. 图像金字塔是指由一组图像且不同分别率的子图集合,它是图像多尺度表达的一种,以多分辨率来解释图像的结构,主要用于图像的分割或压缩.一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合.如图10-1所示,它包括了四层图像,将

  • Python图像运算之图像阈值化处理详解

    目录 一.图像阈值化 二.固定阈值化处理 1.二进制阈值化 2.反二进制阈值化 3.截断阈值化 4.阈值化为0 5.反阈值化为0 三.自适应阈值化处理 四.总结 一.图像阈值化 图像阈值化(Binarization)旨在剔除掉图像中一些低于或高于一定值的像素,从而提取图像中的物体,将图像的背景和噪声区分开来. 灰度化处理后的图像中,每个像素都只有一个灰度值,其大小表示明暗程度.阈值化处理可以将图像中的像素划分为两类颜色,常见的阈值化算法如公式(1)所示: 当某个像素点的灰度Gray(i,j)小于

  • Python图像运算之图像灰度直方图对比详解

    目录 一.灰度增强直方图对比 二.灰度减弱直方图对比 三.图像反色直方图对比 四.图像对数变换直方图对比 五.图像阈值化处理直方图对比 六.总结 一.灰度增强直方图对比 图像灰度上移变换使用的表达式为: DB=DA+50 该算法将实现图像灰度值的上移,从而提升图像的亮度,结合直方图对比的实现代码如下所示. # -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as

随机推荐

其他