图像处理:图像增广算法

news2025/1/9 0:39:26

目录

前言

图像增广算法

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函数,我们可以将多张图像拼接在一起,从而创建一个更大的图像。在拼接过程中,我们需要注意边缘区域可能会有黑边的问题,可以使用图像裁剪来去除。

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

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

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

相关文章

手把手教你安装PaddleDetection(最新CUDA11.7版本)

前言 本文记录一下在linux系安装PaddleDetection的过程&#xff0c;使用Conda的方式来安装&#xff1b; &#xff08;尝试过docker的方式&#xff0c;无法获取镜像&#xff1b;尝试过pip的方式&#xff0c;提升找不到库&#xff1b;最终使用Conda成功安装了。&#xff09; 目…

什么是中国版软件能力成熟度之CSMM

当前&#xff0c;中国软件产业蓬勃发展&#xff0c;产业增速迅猛&#xff0c;发展韧性和潜力进一步凸显。由于我国长期缺乏相关的自主标准&#xff0c;20多年来国外标准在我国软件评估领域占据主导地位&#xff0c;不仅阻碍了我国自主产业发展&#xff0c;甚至通过评估等手段可…

【STM32CubeMX项目】小时钟V1.0

前言 基于STM32CubeMxSTM32F103C6T6编写时钟功能。现在以及能实现时钟的简单功能&#xff0c;做文记录下。还有很多可以改进的地方&#xff0c;也算留下的基础版本下来备份吧。我愿称之为V1.0版本。可供学习参考。 实物 引脚接线&#xff1a; OLED STM32F103 SCL --> PB8 SD…

使用JS手动实现SementicUI的分页,解决页数过多的问题.

自己使用SemanticUI官网的分页组件&#xff0c; 但是有很多细节问题并没有解决方案&#xff0c;如果只是需要而分页&#xff0c;将页数渲染在分页组件上的话&#xff0c;那倒很简单&#xff0c;但是页面有很多的话&#xff0c;假如100页&#xff0c;那么整个tbody会随着tfoot…

C# PDF附件生成

最近项目上需要生成行业某证件&#xff0c;查阅了一下&#xff0c;大体有两个思路可以实现 1.图片格式 2.PDF格式 使用图片格式&#xff0c;GDI绘图的形式&#xff0c;GDI绘图相关库资料比较多&#xff0c;难度也还好&#xff0c;问题是生成的证不是很好看&#xff0c;看上去…

ESP32学习笔记 -- ESP32-S3使用自定义分区表

什么是分区表? 分区表(Partition Table),主要是用来对ESP32-S3外挂的SPI FLASH进行区域划分的一个表格,通过这个表格,可以根据多个不同的功能,将SPI FLASH划分为不同的区域,方便开发者存储数据。 分区表主要有两种格式,一种是方便开发人员进行更改的.csv格式,一种是…

【Spring框架全系列】初识Spring MVC(上)

&#x1f303;哈喽&#xff0c;大家好&#xff0c;我是小浪。接着上篇博客&#xff0c;我们学习了springboot配置日志文件&#xff0c;到此&#xff0c;那么springboot的内容也更新的差不多了&#xff0c;由于是初学阶段&#xff0c;所以不学习那么深入&#xff0c;那么我们学习…

数据结构:单链表增、删、查、改的实现

1.概念 链表是一种 物理存储结构上非连续 、非顺序的存储结构&#xff0c;数据元素的 逻辑顺序 是通过链表 中的 指针链接 次序实现的 。 2.形式 我们使用链表一般都是创建一个结构体。 typedef int SLTDataType; typedef struct SListNode {SLTDataType data;struct SListN…

USB2.0 HUB的MTT与STT

HUB&#xff1a;集线器 以前呀&#xff0c;我也不清楚MTT与STT的区别&#xff0c;记得有一次选型的时候&#xff0c;很懵逼&#xff0c;结果还是按照以前同事的方案去选了&#xff0c;到后面想起来才抽空整明白了。 所以今天就来说下USB HUB里面的MTT与STT&#xff0c;并在文…

【GO】31. websocket实现

一. 引入gin、gorilla websocket包 go get github.com/gin-gonic/gin go get github.com/gorilla/websocket 二. 服务端代码 package mainimport ("bytes""fmt""github.com/gin-gonic/gin""github.com/gorilla/websocket""log&…

从字节出来的测试总监,让我们用这份《测试用例规范》,再也没加班过。

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 固然&#xff0c;编写一份好的测试用例需要&#xff1a;充分的需求分析能力 理论及经验加持&#xff0c;作为测试职场摸爬打滚的老人&…

RobotStudio教程:ABB机器人TCP路径轨迹跟踪功能介绍与使用方法

目录 功能介绍 机器人工作站创建 TCP路径轨迹全局跟踪 基于事件管理器的TCP路径轨迹局部跟踪 基于Smart组件的TCP路径轨迹局部跟踪 仿真运行 功能介绍 干涉检查是虚拟仿真工作中非常重要的一个步骤&#xff0c;尤其是机器人工具与工件、工装夹具之间的碰撞干涉&#xff…

Java高阶数据结构 图的最短路径问题

图的最短路径问题&#xff01; 文章目录 Java高阶数据结构 & 图的最短路径问题1. Dijkstra算法【单源最短路径】1.1 Dijkstra算法证明1.2 Dijkstra算法代码实现1.3 堆优化的Dijkstra算法1.4 堆优化Dijkstra算法代码实现 2. Bellman-Ford算法【单源最短路径】2.1 BF算法证明…

常见的基础模块电路,你都能看懂吗?

文章开始前&#xff0c;先来考考大家~ 下面的五副电路图&#xff0c;你能看懂几个&#xff1f; 目录 01.电源电路 02.运算放大器电路 03.信号产生电路 04.信号处理电路 05.传感器及其应用电路 06.显示电路 TDA2030电路图 34063电路图 555电路 TDA2030电路图 三极管分立元…

音视频八股文(11)-- ffmpeg 音频重采样

1重采样 1.1 什么是重采样 所谓的重采样&#xff0c;就是改变⾳频的采样率、sample format、声道数等参数&#xff0c;使之按照我们期望的参数输出。 1.2 为什么要重采样 为什么要重采样&#xff1f;当然是原有的⾳频参数不满⾜我们的需求&#xff0c;⽐如在FFmpeg解码⾳频…

从头开始学习Python接口自动化测试:编写测试用例,执行测试以及生成测试报告

Python接口自动化测试详解 随着Web服务和移动应用不断增多&#xff0c;以及对API和微服务的需求不断增加&#xff0c;API已成为现代应用程序中必不可少的组件。自动化测试框架可以大大简化API测试的过程&#xff0c;并确保其正确性和稳定性。Python是一种非常流行的编程语言&a…

洛谷B2100 同行列对角线的格

同行列对角线的格 题目描述 输入三个自然数 N N N&#xff0c; i i i&#xff0c; j j j&#xff08; 1 ≤ i ≤ n 1 \le i \le n 1≤i≤n&#xff0c; 1 ≤ j ≤ n 1 \le j \le n 1≤j≤n&#xff09;&#xff0c;输出在一个 N N N \times N NN 格的棋盘中&#xff08;行…

西门子1200PLC如何在威纶通HMI上进行时间显示

先生成定时器DB&#xff0c;然后在引脚绑定变量&#xff0c;在西门子PLC中&#xff0c;DINT和TIME之间可以隐含转化。 第一种方法&#xff1a;触摸屏元件设置成DINT类型 数值元件资料格式为32-bit Signed&#xff0c;对应PLC中即为DINT类型。小数点以下没有位数。这是我们测试…

Android RecyclerView实现侧滑删除,附 Demo

距上次写博客有半年多了&#xff0c;回忆起来都觉得不可思议&#xff0c;中间也想憋俩大招&#xff0c;总是被耽误&#xff0c;这俩月忙完之后&#xff0c;终于空下来了&#xff0c;恰好新项目我和UI俩人商量一下&#xff0c;用MD来实现app。中间有个需求是RecyclerView中侧滑显…

ch06-Pytorch的正则化与归一化

ch06-Pytorch的正则化与归一化 0.引言1.weight decay 和 dropout1.1.Regularization1.2.Dropout 2.Normalization2.1.Batch Normalization2.2.Batch Normalization in PyTorch2.2.1.nn.BatchNorm1d()2.2.2.nn.BatchNorm2d()2.2.3.nn.BatchNorm3d() 2.3.其他常见的Normalization…