返回顶部
首页 > 资讯 > 后端开发 > Python >详解Python+OpenCV进行基础的图像操作
  • 343
分享到

详解Python+OpenCV进行基础的图像操作

2024-04-02 19:04:59 343人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录介绍形态变换腐蚀膨胀创建边框强度变换对数变换线性变换去噪彩色图像使用直方图分析图像介绍 众所周知,OpenCV是一个用于计算机视觉和图像操作的免费开源库。 OpenCV 是用 c

介绍

众所周知,OpenCV是一个用于计算机视觉和图像操作的免费开源库。

OpenCV 是用 c++ 编写的,并且有数千种优化算法和函数用于各种图像操作。很多现实生活中的操作都可以使用 OpenCV 来解决。例如视频和图像分析、实时计算机视觉、对象检测、镜头分析等。

许多公司、研究人员和开发人员为 OpenCV 的创建做出了贡献。使用OpenCV 很简单,而且 OpenCV 配备了许多工具和功能。让我们使用 OpenCV 来执行有趣的图像操作并查看结果。

形态变换

形态变换是基于形状变换图像的图像处理方法。这个过程有助于区域形状的表现和刻画。这些转换使用应用于输入图像的结构元素,并生成输出图像。

形态学操作有多种用途,包括从图像中去除噪声、定位图像中的强度凹凸和孔洞,以及连接图像中的不同元素。

有两种主要的形态学变换类型:腐蚀和膨胀。

腐蚀

腐蚀是为了减小前景对象的大小而执行的形态学操作。异物的边界被慢慢腐蚀。腐蚀在图像编辑和转换中有许多应用,腐蚀会缩小图像像素。对象边界上的像素也被删除。

腐蚀的实现在 python 中很简单,可以在内核的帮助下实现。

让我们开始使用 Python 中的代码来实现腐蚀。

首先,我们导入 Open CV 和 Numpy。

import cv2
import numpy as np

现在我们读取图像。

image = cv2.imread("image1.jpg")

图片:

我们创建了一个执行腐蚀操作所需的内核,并使用内置的 OpenCV 函数实现它。

# Creating kernel
kernel = np.ones((5, 5), np.uint8)
# Using cv2.erode() method 
image_erode = cv2.erode(image, kernel)

现在,我们保存文件并查看。

filename = 'image_erode1.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, image_erode)

图片:

正如我们所看到的,图像现在被腐蚀了,锐度和边缘都减少了,图像变得模糊了。腐蚀可用于隐藏或删除图像的某些部分或隐藏图像中的信息。

让我们尝试不同类型的腐蚀。

kernel2 = np.ones((3, 3), np.uint8)
image_erode2 = cv2.erode(image, kernel2, cv2.BORDER_REFLECT)

现在,我们保存图像文件。

filename = 'image_erode2.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, image_erode2)

图片:

现在,让我们看看什么是膨胀。

膨胀

膨胀过程与腐蚀相反。图像膨胀时,前景对象不是缩小,而是扩大。图像里的东西在边界附近扩张,并形成一个膨胀的物体。

图像中的明亮区域在膨胀后往往会“发光”,这通常会导致图像增强。因此,膨胀用于图像校正和增强。

让我们使用 Python 代码实现 Dilation。

kernel3 = np.ones((5,5), np.uint8)
image_dilation = cv2.dilate(image, kernel, iterations=1)

现在,我们保存图像。

filename = 'image_dilation.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, image_dilation)

图片:

正如我们所见,图像现在更亮,强度更高。

创建边框

为图像添加边框非常简单,我们的手机图库应用程序或编辑应用程序可以非常快速地完成。但是,现在让我们使用 Python 为图像创建边框。

## Using cv2.copyMakeBorder() method
image_border1 = cv2.copyMakeBorder(image, 25, 25, 10, 10, cv2.BORDER_CONSTANT, None, value = 0)

现在,让我们保存图像。

filename = 'image_border1.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, image_border1)

图片:

在这里,我们为图像添加了一个简单的黑色边框。现在,让我们尝试一些镜像边框。

#making a mirrored border
image_border2 = cv2.copyMakeBorder(image, 250, 250, 250, 250, cv2.BORDER_REFLECT)

现在,我们保存图像。

filename = 'image_border2.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, image_border2)

图片:

这很有趣,它看起来像是奇异博士的镜子维度中的东西。

让我们试试别的。

#making a mirrored border
image_border3 = cv2.copyMakeBorder(image, 300, 250, 100, 50, cv2.BORDER_REFLECT)

现在,我们保存图像。

filename = 'image_border3.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, image_border3)

图片:

强度变换

通常,由于各种原因,图像会发生强度变换。这些是在空间域中直接在图像像素上完成的。图像阈值处理和对比度处理等操作是使用强度转换完成的。

对数变换

对数变换是一种强度变换操作,其中图像中的像素值被替换为它们的对数值。

对数变换用于使图像变亮或增强图像,因为它将图像中较暗的像素扩大到较高的像素值。

让我们实现对数变换。

# Apply log transfORM.
c = 255/(np.log(1 + np.max(image)))
log_transformed = c * np.log(1 + image)
# Specify the data type.
log_transformed = np.array(log_transformed, dtype = np.uint8)

现在,我们保存图像。

cv2.imwrite('log_transformed.jpg', log_transformed)

图片:

图像变得非常明亮。

线性变换

我们将对图像应用分段线性变换。这种变换也是在空间域上完成的。此方法用于为特定目的修改图像。它被称为分段线性变换,因为它只有一部分是线性的。最常用的分段线性变换是对比拉伸。

通常,如果在低光照条件下单击图像并且周围照明不佳,则生成的图像对比度较低。对比度拉伸会增加图像中强度级别的范围,并且对比度拉伸函数会单调增加,从而保持像素强度的顺序。

现在,让我们实现对比度拉伸。

def pixelVal(pix, r1, s1, r2, s2):
    if (0 <= pix and pix <= r1):
        return (s1 / r1)*pix
    elif (r1 < pix and pix <= r2):
        return ((s2 - s1)/(r2 - r1)) * (pix - r1) + s1
    else:
        return ((255 - s2)/(255 - r2)) * (pix - r2) + s2
# Define parameters.
r1 = 70
s1 = 0
r2 = 140
s2 = 255
# Vectorize the function to apply it to each value in the Numpy array.
pixelVal_vec = np.vectorize(pixelVal)
# Apply contrast stretching.
contrast_stretch = pixelVal_vec(image, r1, s1, r2, s2)
# Save edited image.
cv2.imwrite('contrast_stretch.jpg', contrast_stretch)

图片:

在这里,图像得到了改善,并且可以观察到更高的对比度。

去噪彩色图像

去噪信号或图像意味着去除不必要的信号和信息以获得有用的信号和信息。去噪以去除不需要的噪声,并更好地分析和处理图像。

让我们用 Python 对彩色图像进行去噪。

denoised_image = cv2.fastNlMeansDenoisinGColored(image, None, 15, 8, 8, 15)

现在,我们保存图像。

# Save edited image.
cv2.imwrite('denoised_image.jpg', denoised_image)

图片:

我们可以看到很多想要的东西,比如背景和天空已经被删除了。

使用直方图分析图像

在任何形式的分析中,直方图都是必不可少的视觉效果。图像的直方图是理解全局描述的一种令人兴奋的方式,直方图可用于对图像进行定量分析。图像直方图表示图像中灰度级的出现。

我们可以使用直方图来了解数字图像的像素强度分布,也可以使用直方图来了解主色。

让我们绘制一个直方图。

from matplotlib import pyplot as plt
histr = cv2.calcHist([image],[0],None,[256],[0,256])
plt.plot(histr)

输出:

# alternative way to find histogram of an image
plt.hist(image.ravel(),256,[0,256])
plt.show()

输出:

该图显示了图像上 0 到 255 颜色范围内的像素数。我们可以看到,所有类型的颜色都有良好的分布。

现在,让我们将图像转换为黑白并生成直方图。

grey_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
histogram = cv2.calcHist([grey_image], [0], None, [256], [0, 256])
plt.plot(histogram, color='k')

输出:

这个分布和之前的分布有很大的不同。这主要是因为图像被转换为灰度,然后进行分析。

现在,我们执行颜色直方图。

for i, col in enumerate(['b', 'g', 'r']):
    hist = cv2.calcHist([image], [i], None, [256], [0, 256])
    plt.plot(hist, color = col)
    plt.xlim([0, 256])
plt.show()

输出:

我们可以看到蓝色和绿色的像素数量远高于红色。这很明显,因为图像中有很多蓝色和绿色区域。

所以我们可以看到,绘制图像直方图是理解图像强度分布的好方法。

到此这篇关于详解Python+OpenCV进行基础的图像操作的文章就介绍到这了,更多相关Python OpenCV图像操作内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解Python+OpenCV进行基础的图像操作

本文链接: https://lsjlt.com/news/139304.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解Python+OpenCV进行基础的图像操作
    目录介绍形态变换腐蚀膨胀创建边框强度变换对数变换线性变换去噪彩色图像使用直方图分析图像介绍 众所周知,OpenCV是一个用于计算机视觉和图像操作的免费开源库。 OpenCV 是用 C...
    99+
    2024-04-02
  • Python+OpenCV实现图像基本操作的示例详解
    目录1. 计算机眼中的图像2. 图像的表示3. 基础操作 图像的读取4. 截取部分图像数据(ROI)5. 视频的读取6. 边界填充7. 图像的加法 图像的加法1. 计算机眼中的图像 ...
    99+
    2023-05-16
    Python OpenCV图像基本操作 Python OpenCV图像操作 Python OpenCV图像 Python OpenCV
  • python opencv图像处理基本操作示例详解
    目录1.图像基本操作①读取图像②显示图像③视频读取④图像截取⑤颜色通道提取及还原⑥边界填充⑦数值计算⑧图像融合2.阈值与平滑处理①设定阈值并对图像处理②图像平滑-均值滤波③图像平滑-...
    99+
    2024-04-02
  • 详解OpenCV图像的概念和基本操作
    前言: opencv最主要的的功能是用于图像处理,所以图像的概念贯穿了整个opencv,与其相关的核心类就是Mat。 像素: 图片尺寸以像素为单位时,每一厘米等于28像素,如15...
    99+
    2024-04-02
  • OpenCV半小时掌握基本操作之图像基础操作
    目录概述截取图像获取颜色通道读取视频【OpenCV】⚠️高手勿入! 半小时学会基本操作⚠️ 图像基础操作 概述 OpenCV 是一...
    99+
    2024-04-02
  • Python OpenCV实现图像增强操作详解
    目录创作背景图像亮度增强和降低旋转水平镜像和垂直镜像高斯噪声其它图像增强的方法创作背景 最近在忙着两个YOLOv7项目,通过看大量的论文,发现很多的相关的论文都会在收集图像后进行图像...
    99+
    2024-04-02
  • OpenCV-Python 对图像的基本操作代码
    import cv2 as cv import numpy as np import matplotlib.pyplot as plt # 设置兼容中文 plt.rcParams...
    99+
    2024-04-02
  • Python+OpenCV实现基本的图像处理操作
    目录模块的安装图片的各种操作读取图像展示图像图片保存图片的各种属性图像的基本操作今天小编来和大家分享一下Python在图像处理当中的具体应用,那既然是图像处理,那必然要提到openc...
    99+
    2024-04-02
  • OpenCV基础操作中图片的读取与写出怎么进行
    今天给大家介绍一下OpenCV基础操作中图片的读取与写出怎么进行。,文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。1、进行图片读取的函数是:cv2.imread...
    99+
    2023-06-26
  • opencv-python基本图像处理详解
    目录一、使用matplotlib显示图1、显示热量图 2、显示灰度图二、使用cv.imread显示图像1、显示灰度图像总结一、使用matplotlib显示图 impor...
    99+
    2024-04-02
  • Python Pandas基础操作详解
    目录数据结构&Series:DataFrame的构建:索引操作:DataFrame基本操作:广播运算:索引增删改查:字符串元素处理:数据规整:总结数据结构&Serie...
    99+
    2024-04-02
  • Python OpenCV对图像进行模糊处理详解流程
    其实我们平时在深度学习中所说的卷积操作,在 opencv 中也可以进行,或者说是类似操作。那么它是什么操作呢?它就是图像的模糊(滤波)处理。 均值滤波 使用 opencv 中的cv2...
    99+
    2024-04-02
  • python opencv图像处理基本操作的示例分析
    本篇文章给大家分享的是有关python opencv图像处理基本操作的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。①读取图像②显示图像该函数中,name是显示窗口的名...
    99+
    2023-06-25
  • Python基于OpenCV的视频图像处理详解
    目录初识OpenCV视频读写处理运动轨迹标记运动检测运动方向检测初识OpenCV OpenCV是一个开源的,跨平台的计算机视觉库,它采用优化的C/C++代码编写,能够充分利用多核处理...
    99+
    2023-02-02
    Python OpenCV视频图像处理 Python 视频图像处理 Python OpenCV 图像处理
  • PythonOpenCV对图像像素进行操作
    目录遍历并修改图像像素值图像的加减乘除运算遍历并修改图像像素值 在使用opencv处理图像时,有时需要对图像的每个像素点进行处理,比如取反、修改值等操作,就需要通过h和w遍历像素。依...
    99+
    2024-04-02
  • opencv-python图像处理安装与基本操作方法
    目录一、安装opencv二、 opencv使用一、安装opencv 关于opencv的安装,如果是windows系统下使用pycharm,那么直接在在终端使用pip命令或者点击设置-...
    99+
    2024-04-02
  • 如何利用Python和OpenCV对图像进行加水印详解
    目录前言🌌 第 1 步:导入 OpenCV 并读取logo和要应用水印的图像💨 第 2步:计算两个图像的高度和宽度🚀 第 3 步:将水...
    99+
    2024-04-02
  • 基于QtOpenCV的图像灰度化像素操作详解
    效果图 实现代码 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<opencv2/o...
    99+
    2024-04-02
  • python字符串基础操作详解
    目录字符串的赋值单引号字符串赋值给变量双引号字符串赋值给变量三引号字符串赋值给变量(多行)字符串的截取截取指定位置的字符获取指定位置之后的所有字符截取指定位置之前的所有字符获取所有的...
    99+
    2024-04-02
  • 【OpenCV】数字图像的表示 | 图像IO操作接口 | 图像混合操作
        Ⅰ. 数字图像的表示 0x00 位数 计算机采用0/1编码的系统,数字图像也是利用0/1来记录信息。 我们平常接触的图像都是8位数图像,包含0~255灰度。  0:代表最黑 1:表示最白   0x01 二...
    99+
    2023-08-31
    计算机视觉 opencv 图像处理 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作