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


Posted in Python onFebruary 15, 2022

介绍

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

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

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

形态变换

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

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

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

腐蚀

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

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

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

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

import cv2
import numpy as np

现在我们读取图像。

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

图片:

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

我们创建了一个执行腐蚀操作所需的内核,并使用内置的 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)

图片:

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

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

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

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+OpenCV进行基础的图像操作

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

膨胀

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

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

让我们使用 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+OpenCV进行基础的图像操作

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

创建边框

为图像添加边框非常简单,我们的手机图库应用程序或编辑应用程序可以非常快速地完成。但是,现在让我们使用 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)

图片:

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

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

#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)

图片:

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

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

让我们试试别的。

#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)

图片:

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

强度变换

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

对数变换

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

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

让我们实现对数变换。

# 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)

图片:

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

图像变得非常明亮。

线性变换

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

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

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

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+OpenCV进行基础的图像操作

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

去噪彩色图像

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

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

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

现在,我们保存图像。

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

图片:

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

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

使用直方图分析图像

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

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

让我们绘制一个直方图。

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

输出:

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

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

输出:

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

该图显示了图像上 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')

输出:

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

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

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

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进行基础的图像操作的文章就介绍到这了,更多相关Python OpenCV图像操作内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现线程池代码分享
Jun 21 Python
举例详解Python中yield生成器的用法
Aug 05 Python
Python2和Python3中print的用法示例总结
Oct 25 Python
pandas创建新Dataframe并添加多行的实例
Apr 08 Python
sublime python3 输入换行不结束的方法
Apr 19 Python
python3实现域名查询和whois查询功能
Jun 21 Python
Windows下PyCharm安装图文教程
Aug 27 Python
pycharm: 恢复(reset) 误删文件的方法
Oct 22 Python
numpy按列连接两个维数不同的数组方式
Dec 06 Python
Django日志及中间件模块应用案例
Sep 10 Python
自己搭建resnet18网络并加载torchvision自带权重的操作
May 13 Python
实例详解Python的进程,线程和协程
Mar 13 Python
Appium中scroll和drag_and_drop根据元素位置滑动
Feb 15 #Python
python 远程执行命令的详细代码
Feb 15 #Python
python 详解turtle画爱心代码
python分分钟绘制精美地图海报
基于PyQT5制作一个桌面摸鱼工具
Feb 15 #Python
python接口测试返回数据为字典取值方式
Feb 12 #Python
Python socket如何解析HTTP请求内容
Feb 12 #Python
You might like
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
PHP 文本文章分页代码 按标记或长度(不涉及数据库)
2012/06/07 PHP
codeigniter中测试通过的分页类示例
2014/04/17 PHP
PHP的preg_match匹配字符串长度问题解决方法
2014/05/03 PHP
PHP中文乱码解决方案
2015/03/05 PHP
浅谈本地WAMP环境的搭建
2015/05/13 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
Javascript 判断Flash是否加载完成的代码
2010/04/12 Javascript
javascript变量作用域使用中常见错误总结
2013/03/26 Javascript
通过length属性判断jquery对象是否存在
2013/10/18 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
详解 vue better-scroll滚动插件排坑
2018/02/08 Javascript
vue权限问题的完美解决方案
2019/05/08 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
微信小程序动态显示项目倒计时
2019/06/20 Javascript
js回溯法计算最佳旅行线路代码实例
2019/09/11 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
Vue组件基础用法详解
2020/02/05 Javascript
详解React 条件渲染
2020/07/08 Javascript
[01:50]WODOTA制作 DOTA2中文宣传片《HERO》
2013/04/28 DOTA
[01:09:13]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第三场 1月19日
2021/03/11 DOTA
Django Highcharts制作图表
2016/08/27 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
2019/05/29 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
Canvas系列之滤镜效果
2019/02/12 HTML / CSS
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
销售员自我评价怎么写
2013/09/19 职场文书
工厂门卫岗位职责
2013/11/25 职场文书
婚庆司仪主持词
2014/03/15 职场文书
共产党员公开承诺书范文
2014/03/28 职场文书
食品安全承诺书
2014/05/22 职场文书
科学发展观活动总结
2014/08/28 职场文书
2016年国培心得体会及反思
2016/01/13 职场文书