opencv 图像预处理

图像预处理

​ 在计算机视觉和图像处理领域,图像预处理是一个重要的步骤,它能够提高后续处理(如特征提取、目标检测等)的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法,以下是一些常见的图像预处理操作:

  1. 图像空间转换
  2. 图像大小调整
  3. 图像仿射变换
  4. 图像翻转
  5. 图像裁剪
  6. 图像二值化处理
  7. 图像去噪
  8. 边缘检测
  9. 图像平滑处理
  10. 图像形态学

图像翻转

cv2.flip 是 OpenCV 库中的一个函数,用于翻转图像。翻转可以是水平翻转、垂直翻转或同时水平和垂直翻转。这个函数接受两个参数:要翻转的图像和一个指定翻转类型的标志。

函数签名

cv2.flip(src, flipCode[, dst]) -> dst

参数说明

  • src:输入图像,可以是任意类型和深度的多通道图像。

  • flipCode

    :指定翻转类型的整数标志:

    • 0:沿 X 轴翻转(垂直翻转)
    • 1:沿 Y 轴翻转(水平翻转)
    • -1:沿 X 轴和 Y 轴翻转(同时水平和垂直翻转)
  • dst:可选参数,输出图像。如果未提供,输出图像将与输入图像具有相同的尺寸和类型。

示例

以下是一些使用 cv2.flip 的示例代码:

import cv2img = cv2.imread('../images/car.png')# 翻转
# 0:垂直翻转
# 1:水平翻转
# -1:水平垂直翻转
flip_img = cv2.flip(img, -1)
cv2.imshow('img', img)
cv2.imshow('flip_img', flip_img)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

图像仿射变换

仿射变换(Affine Transformation)是一种线性变换,它保持了点之间的相对距离不变,即平行线在变换后仍然保持平行。在图像处理中,仿射变换常用于旋转、缩放、平移和剪切等操作。

图像旋转

旋转操作可以将图像绕着某个点旋转一定的角度

实例代码

def cv_affinetransformation():img = cv2.imread('../images/car.png')if img is None:print("Error: Image not found.")return# 获取图像大小(height, width) = img.shape[:2]# 定义旋转中心点center = (width // 2, height // 2)# 旋转角度angle = 60# 计算旋转矩阵m = cv2.getRotationMatrix2D(center, angle, 1.0)# 图像旋转affine = cv2.warpAffine(img, m, (width, height))cv2.imshow('Rotated Image', affine)cv2.waitKey(0)cv2.destroyAllWindows()

在这里插入图片描述

cv2.getRotationMatrix2D 是 OpenCV 库中的一个函数,用于获取旋转矩阵。这个函数主要用于图像的旋转变换。旋转矩阵是一个 2x3 的矩阵,可以用来将图像围绕指定的中心点旋转指定的角度,并且可以选择是否进行缩放。

函数签名

cv2.getRotationMatrix2D(center, angle, scale) -> M

参数说明

  • center:旋转中心点的坐标,格式为 (x, y)
  • angle:旋转角度,单位为度。正角度表示逆时针旋转,负角度表示顺时针旋转。
  • scale:缩放比例。如果设置为 1,则不进行缩放。

返回值

  • M:2x3 的旋转矩阵。

示例

以下是一个使用 cv2.getRotationMatrix2D 的示例代码,

cv2.warpAffine 函数

仿射变换 函数

cv2.warpAffine(src, M, dsize, dst) →
  • src: 输入图像。
  • M: 2x3 的变换矩阵,类型为 np.float32
  • dsize: 输出图像的尺寸,形式为 (width, height)
  • dst (可选): 输出图像。如果未提供,则会自动创建一个新的图像。

图像平移

平移操作可以将图像中的每个点沿着某个方向移动一定的距离

def cv_warpaffine():img = cv2.imread('../images/car.png')if img is None:print("Error: Image not found.")return# 获取图像大小(height, width) = img.shape[:2]# 定义水平和垂直移动的距离tx, ty = 50, 100# 定义平移矩阵t_img = np.float32([[1, 0, tx], [0, 1, ty]])# 应用平移变换w_img = cv2.warpAffine(img, t_img, (width, height))cv2.imshow('Translated Image', w_img)cv2.waitKey(0)cv2.destroyAllWindows()

其中,tx 和 ty 分别表示在x轴和y轴方向上的平移距离。
在这里插入图片描述

图像缩放

缩放操作可以改变图像的大小

import cv2
import numpy as np# 读取图像
img = cv2.imread("images/car5.png")
h, w, channels = img.shape
# 定义缩放因子
sx, sy = 1.5, 1.5
M = np.float32([[sx, 0, 0], [0, sy, 0]])
# 应用缩放变换
scaled = cv2.warpAffine(img, M, (int(w * sx), int(h* sy)))
# 显示结果
cv2.imshow('Scaled Image', scaled)
cv2.waitKey(0)
cv2.destroyAllWindows()

sx 和 sy 分别表示在x轴和y轴方向上的缩放因子。
在这里插入图片描述

图像剪切

剪切操作可以改变图像的形状,使其在某个方向上倾斜

import cv2
import numpy as np# 读取图像
img = cv2.imread("images/car5.png")
rows, cols, _ = img.shape
# 定义剪切因子
shx, shy = 0.2, 0.2
M = np.float32([[1, shx, 0], [shy, 1, 0]])
# 应用剪切变换
sheared = cv2.warpAffine(img, M, (cols, rows))# 显示结果
cv2.imshow('Sheared Image', sheared)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像色彩空间转换

OpenCV中的色彩空间转换是将图像从一种颜色表示形式转换为另一种颜色表示形式的过程。常见的颜色空间包括RGB、HSV、YUV等。

色彩空间转换有几个重要的作用:

  1. 方便图像处理:在不同的颜色空间中,对应的通道代表了不同的属性,例如在RGB空间中,红、绿、蓝三个通道分别代表了颜色的强度,而在HSV空间中,H(色相)代表了颜色的种类,S(饱和度)代表了颜色的深浅,V(亮度)代表了颜色的明暗。因此,对于不同的处理需求,选择不同的颜色空间进行处理可以更加方便。
  2. 提高图像处理效果:在某些情况下,使用某些特定的颜色空间可以提高图像处理的效果。例如,在HSV空间中,可以通过调整S(饱和度)和V(亮度)来提高图像的对比度并去除噪点。
  3. 节省计算资源:在某些情况下,使用特定的颜色空间可以帮助我们节省计算资源。例如,在RGB空间中,每个像素需要3个通道来表示,而在灰度空间中,每个像素只需要一个通道就可以表示。因此,如果我们只需要处理亮度信息而不需要颜色信息时,将图像转换为灰度空间可以节省计算资源。

总之,色彩空间转换在图像处理中是一项非常重要的技术,它可以方便我们对图像进行处理,并提高图像处理的效果和节省计算资源。

cv2.cvtColor()是OpenCV中的一个函数,用于图像颜色空间的转换。它可以将一个图像从一个颜色空间转换为另一个颜色空间,比如从RGB到灰度图像的转换,或者从BGR到HSV的转换等。

函数的语法如下:

cv2.cvtColor(src, code)

参数说明:

  • src:输入图像,可以是一个NumPy数组或者一个OpenCV的Mat对象。
  • code:指定转换的类型,可以使用预定义的转换代码,例如cv2.COLOR_BGR2GRAY表示从BGR到灰度图像的转换。

RGB 转 Gray(灰度)

RGB 转 Gray(灰度),将彩色图像转换为灰度图像,可以减少数据量并简化算法。

def cv_color():img = cv2.imread('../images/p1.png')# 图像色彩空间转换gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 灰度图像# gray = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # HSV颜色空间cv2.imshow('img', img)cv2.imshow('gray', gray)cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':cv_color()

在这里插入图片描述

RGB 转 HSV

RGB 转 HSV,HSV(Hue, Saturation, Value)色彩空间在颜色分割和颜色识别中非常有用。

def cv_color():img = cv2.imread('../images/p1.png')# 图像色彩空间转换# gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # HSV颜色空间cv2.imshow('img', img)cv2.imshow('gray', gray)cv2.waitKey(0)cv2.destroyAllWindows()

在这里插入图片描述

图像二值化处理

案例:

def binaryzation():img = cv2.imread('../images/p1.png')g_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化# ret:实际应用阈值# binary:二值化后的图像ret, binary = cv2.threshold(g_img, 150, 230, cv2.THRESH_BINARY)cv2.imshow('binary', binary)cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':binaryzation()

在这里插入图片描述

cv2.threshold 是 OpenCV 中用于图像二值化的函数。它通过设置阈值将图像分为前景和背景,常用于图像处理和分析。以下是该函数的主要功能和用法简介:

功能

cv2.threshold 将灰度图像转换为二值图像,根据指定的阈值将像素值分为两类:高于阈值的像素设为一个值(通常是255),低于阈值的像素设为另一个值(通常是0)。

语法

retval, dst = cv2.threshold(src, thresh, maxval, type)

参数

  1. src: 输入的灰度图像。

  2. thresh: 阈值,决定分割的界限。

  3. maxval: 当像素值超过阈值时,赋予的最大值(通常为255)。

  4. type
    阈值类型,常用的有:
    • cv2.THRESH_BINARY: 超过阈值的像素设为最大值,其余设为0。
    • cv2.THRESH_BINARY_INV: 超过阈值的像素设为0,其余设为最大值。
    • cv2.THRESH_TRUNC: 超过阈值的像素设为阈值,其余不变。
    • cv2.THRESH_TOZERO: 超过阈值的像素不变,其余设为0。
    • cv2.THRESH_TOZERO_INV: 超过阈值的像素设为0,其余不变。

返回值

  • retval: 实际使用的阈值(可能与输入值不同)。
  • dst: 输出的二值图像。

图像掩模

它通常用于创建掩模,以便从图像中提取特定颜色的区域。

函数原型

cv2.inRange(src, lowerb, upperb)

参数

  • src: 输入的图像,可以是彩色图像或灰度图像。
  • lowerb: 颜色范围的下界(数组或元组),指定了要提取的颜色的最小值。
  • upperb: 颜色范围的上界(数组或元组),指定了要提取的颜色的最大值。

返回值

  • 返回一个二值图像,白色部分表示在指定颜色范围内的区域,黑色部分表示不在范围内的区域

图像位与操作

cv2.bitwise_and() 是 OpenCV 库中的一个函数,用于对两个图像进行按位与操作。这个操作会逐个像素地对两个输入图像进行比较,只有在两个像素均为 255(白色)时,输出的像素才会为 255(白色),否则输出为 0(黑色)。这个函数在图像处理中的应用非常广泛,尤其是在掩膜和图像分割等任务中

函数原型

dst = cv2.bitwise_and(src1, src2, mask=None)

参数说明

  • src1: 第一个输入图像。
  • src2: 第二个输入图像。两幅图像应具有相同的尺寸和类型。
  • mask: 可选参数,用于指定一个掩膜。如果提供,只有在掩膜的相应位置为非零时,才会计算输出。

返回值

  • 返回按位与操作后的图像(dst)。

图像检测轮廓

cv2.findContours 函数可以在二值图像中找到轮廓,并返回轮廓的点集。轮廓可以用来表示物体的边界,常用于物体检测、分割和形状分析。

语法

contours, hierarchy = cv2.findContours(image, mode, method)

参数

  1. image: 输入的二值图像。通常在调用该函数之前需要将图像转换为灰度图像并进行二值化处理(如使用 cv2.thresholdcv2.Canny)。

  2. mode
    轮廓检索模式:
    • cv2.RETR_EXTERNAL: 只检索外部轮廓。
    • cv2.RETR_LIST: 检索所有轮廓,并将其放入列表中。
    • cv2.RETR_TREE: 检索所有轮廓,并建立层级关系。
  3. method
    轮廓逼近方法:
    • cv2.CHAIN_APPROX_SIMPLE: 压缩轮廓,仅保留端点。
    • cv2.CHAIN_APPROX_NONE: 保留所有轮廓点。

返回值

  • contours: 一个 Python 列表,其中每个元素是一个轮廓(即一组点),轮廓的点以 NumPy 数组的形式存储。
  • hierarchy: 轮廓的层级信息,包含轮廓之间的关系。

cv2.boundingRect 函数介绍

cv2.boundingRect 是 OpenCV 中用于计算轮廓的最小外接矩形的函数。这个函数可以返回一个包含轮廓的最小矩形的边界框,通常用于对象检测、图像分割等任务中。最小外接矩形是一个完全包围轮廓的矩形,其边与图像的坐标轴平行。

案例

import cv2
import numpy as np
import paddlehub as hubqie_img = Nonedef find_contours():global qie_imgimg = cv2.imread("../images/car.png")hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# HSV颜色空间中,蓝色对应的颜色范围lower_blue = np.array([100, 100, 100])upper_blue = np.array([140, 255, 255])# 创建掩膜# 在HSV空间中,将颜色范围限定在lower_blue和upper_blue之间mask = cv2.inRange(hsv, lower_blue, upper_blue)# # 转换成灰度图像# gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化处理ret, binary = cv2.threshold(mask, 120, 255, cv2.THRESH_BINARY)# 获取图片轮廓contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# num = len(contours)# print("轮廓数量:", num)for i in contours:x, y, w, h = cv2.boundingRect(i)# 画矩形if w > 100 and h > 45:cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)qie_img = img[y:y + h, x:x + w]cv2.imshow("qie_img", qie_img)# 识别车牌信息# 加载模型ocr = hub.Module(name="chinese_ocr_db_crnn_server")# 识别文本result = ocr.recognize_text(images=[qie_img])for i in result:data = i['data']for j in data:print('车牌号是:', j['text'])cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':find_contours()"""
根据识别到的车牌,将车牌识别出来
"""
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/63219135bd104048b45b580fafab37bf.png)

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

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

相关文章

kafka里的consumer 是推还是拉?

大家好,我是锋哥。今天分享关于【kafka里的consumer 是推还是拉?】面试题?希望对大家有帮助; kafka里的consumer 是推还是拉? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Kafka中,消费者&…

第7章 利用CSS和多媒体美化页面作业

2.用表格布局页面&#xff0c;利用CSS技术&#xff0c;及添加多媒体&#xff0c;制作并美化“心灵之音”页面。 浏览效果如下&#xff1a; 实例代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>心灵…

Cisco Packet Tracer 8.0 路由器的基本配置和Telnet设置

文章目录 构建拓扑图配置IP地址配置路由器命令说明测试效果 构建拓扑图 1&#xff0c;添加2811路由器。 2&#xff0c;添加pc0。 3&#xff0c;使用交叉线连接路由器和pc&#xff08;注意线路端口&#xff09;。 4&#xff0c;使用配置线连接路由器和pc&#xff08;注意线路…

Python实现全国岗位招聘信息可视化分析(源码+论文+部署讲解)

项目源码&数据源获取 利用Python实现全国岗位招聘信息可视化分析 项目背景&#xff1a; 1.为企业招聘决策提供科学的依据和参考&#xff0c;可以帮助人力资源部门、招聘机构和求职者了解当前的就业形势、行业趋势和人才需求&#xff0c;从而做出更明智的招聘和求职决策。…

(九)JavaWeb后端开发3——Servlet

目录 1.Servlet由来 2.Servlet快速入门 3.Servlet执行原理 4.Servlet生命周期 1.Servlet由来 在JaveEE API文档中对Servlet的描述是&#xff1a;可以运行在服务器端的微小程序&#xff0c;但是实际上&#xff0c;Servlet就是一个接口&#xff0c;定义了Java类被浏览器访问…

C++设计模式结构型模式———桥接模式

文章目录 一、引言二、桥接模式三、总结 一、引言 桥接&#xff08;Bridge&#xff09;模式也叫桥梁模式&#xff0c;简称桥模式&#xff0c;是一种结构型模式。该模式所解决的问题非常简单&#xff0c;即根据单一职责原则&#xff0c;在一个类中&#xff0c;不要做太多事&…

【android12】【AHandler】【4.AHandler原理篇ALooper类方法全解】

AHandler系列 【android12】【AHandler】【1.AHandler异步无回复消息原理篇】-CSDN博客 【android12】【AHandler】【2.AHandler异步回复消息原理篇】-CSDN博客 【android12】【AHandler】【3.AHandler原理篇AHandler类方法全解】-CSDN博客 其他系列 本人系列文章-CSDN博客…

基于SSM志愿者招募系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;志愿组织管理&#xff0c;组织信息管理&#xff0c;组织申请管理&#xff0c;志愿活动管理活动报名管理 用户账号功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;…

selinux介绍和Linux中的防火墙

selinux 1、selinux的说明 2、selinux的工作原理 3、selinux的启动、关闭与查看 防火墙 1、什么是防火墙 2、iptables &#xff08;1&#xff09;iptables介绍 参数说明 3、firewalld firewalld-cmd的参数说明

RHCE4

一、web服务器简介 1、什么是www www 是 world wide web 的缩写&#xff0c;也就是全球信息广播的意思。通常说的上网就是使用 www 来查询用户所需要的信息。 www 可以结合文字、图形、影像以及声音等多媒体&#xff0c;并通过可以让鼠标单击超链接的方式将信息以 Internet 传…

推荐一款用来快速开发3D建筑模型软件:Allplan

Nemetschek Allplan是一款用来快速开发3D建筑模型软件的软件&#xff0c;它的简单好用但是功能强大&#xff0c;绝对不输AuToDesk&#xff0c;而且人性化的设计更让你可以快速的建立开发及维护你的建筑模型。是与ArchiCAD称兄道弟的强大建筑设计软件&#xff0c;功能上互有短长…

Python面向对象,实现图片处理案例,支持:高斯模糊、Canny边缘检测、反转边缘图像、生成手绘效果、调亮度......等等

实验图片如下&#xff1a; 命名为img1.jpg, 放在项目下新建文件夹images下 项目构造如下&#xff1a; app.py源码如下 import cv2 import os from matplotlib import pyplot as plt import numpy as npclass ImageProcessor:def __init__(self, image_path):self.image cv…

利用LangChain与LLM打造个性化私有文档搜索系统

我们知道LLM&#xff08;大语言模型&#xff09;的底模是基于已经过期的公开数据训练出来的&#xff0c;对于新的知识或者私有化的数据LLM一般无法作答&#xff0c;此时LLM会出现“幻觉”。针对“幻觉”问题&#xff0c;一般的解决方案是采用RAG做检索增强。 但是我们不可能把…

C++ 基础语法 一

C 基础语法 一 文章目录 C 基础语法 一const 限定符常量指针类型别名autodecltypeQStringvector迭代器指针和数组显示转换static_castconst_cast 函数尽量使用常量引用数组形参不要返回局部对象的引用和指针返回数组指针 C四种转换内联函数constexpr函数函数指针 const 限定符 …

tensorflow案例4--人脸识别(损失函数选取,调用VGG16模型以及改进写法)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 这个模型结构算上之前的pytorch版本的&#xff0c;算是花了不少时间&#xff0c;但是效果一直没有达到理想情况&#xff0c;主要是验证集和训练集准确率…

力扣每日一题 超级饮料的最大强化能量 动态规划(dp)

来自未来的体育科学家给你两个整数数组 energyDrinkA 和 energyDrinkB&#xff0c;数组长度都等于 n。这两个数组分别代表 A、B 两种不同能量饮料每小时所能提供的强化能量。 你需要每小时饮用一种能量饮料来 最大化 你的总强化能量。然而&#xff0c;如果从一种能量饮料切换到…

全国产 V7 690T+FT6678 高性能实时信号处理平台设计原理

1、概述 全国产 V7 690TFT6678 高性能实时信号处理平台组成如图 1 所示&#xff0c;包含 1 片SMQ7VX690TFFG1761 和两片 FT-6678&#xff08;国防科大&#xff09;的 DSP&#xff0c;总共 3 个主芯片&#xff1b;每个主芯片外部各搭配 1 组 64bit 的 DDR3 内存模组以及各芯片启…

0.STM32F1移植到F0的各种经验总结

1.结构体的声明需放在函数的最前面 源代码&#xff1a; /*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //开启USART1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructu…

Linux高阶——1027—守护进程

1、守护进程的基本流程 1、父进程创建子进程&#xff0c;父进程退出 守护进程是孤儿进程&#xff0c;但是是工程师人为创建的孤儿进程&#xff0c;低开销模式运行&#xff0c;对系统没有压力 2、子进程&#xff08;守护进程&#xff09;脱离控制终端&#xff0c;创建新会话 …

Selective Generation for Language Models 语言模型的选择性生成

生成式语言模型&#xff08;Generative Language Models, GLMs&#xff09;在文本生成任务中取得了显著进展。然而&#xff0c;生成内容的“幻觉”现象&#xff0c;即生成内容与事实或真实语义不符的问题&#xff0c;仍是GLMs在实际应用中的一个重大挑战。为了解决这一问题&…