详解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刷投票的脚本实现代码
Nov 08 Python
python内存管理分析
Apr 08 Python
python3操作微信itchat实现发送图片
Feb 24 Python
django解决跨域请求的问题详解
Jan 20 Python
Django框架使用mysql视图操作示例
May 15 Python
nginx黑名单和django限速,最简单的防恶意请求方法分享
Aug 09 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
Python pandas RFM模型应用实例详解
Nov 20 Python
Python timeit模块的使用实践
Jan 13 Python
Anconda环境下Vscode安装Python的方法详解
Mar 29 Python
Matplotlib中%matplotlib inline如何使用
Jul 28 Python
python实现网络五子棋
Apr 11 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
Drupal7中常用的数据库操作实例
2014/03/02 PHP
自己写了一个php检测文件编码的函数
2014/04/21 PHP
PHP生成自适应大小的缩略图类及使用方法分享
2014/05/06 PHP
php判断是否为ajax请求的方法
2016/11/29 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
laravel添加前台跳转成功页面示例
2019/10/22 PHP
向fckeditor编辑器插入指定代码的方法
2007/05/25 Javascript
JavaScript 替换Html标签实现代码
2009/10/14 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
javascript阻止scroll事件多次执行的思路及实现
2013/11/08 Javascript
JS创建自定义表格具体实现
2014/02/11 Javascript
JavaScript中的闭包介绍
2015/03/15 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
jQuery.deferred对象使用详解
2016/03/18 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
vue-quill-editor富文本编辑器简单使用方法
2018/09/21 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
webpack file-loader和url-loader的区别
2019/01/15 Javascript
用Node写一条配置环境的指令
2019/11/14 Javascript
vue+render+jsx实现可编辑动态多级表头table的实例代码
2020/04/01 Javascript
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
python安装numpy和pandas的方法步骤
2019/05/27 Python
Python Spyder 调出缩进对齐线的操作
2021/02/26 Python
css3的transition效果和transfor效果示例介绍
2013/10/30 HTML / CSS
利用CSS3实现单选框动画特效示例代码
2016/09/26 HTML / CSS
汽车技术服务英文求职信范文
2014/01/02 职场文书
致全体运动员广播稿
2014/02/01 职场文书
运动会跳远广播稿
2014/02/04 职场文书
村当支部个人对照检查材料思想汇报
2014/10/06 职场文书
2015年119消防宣传日活动总结
2015/03/24 职场文书
高三教师工作总结2015
2015/07/21 职场文书
2019年年中职场激励人心语录30条
2019/08/07 职场文书
如何用JavaScript实现一个数组惰性求值库
2021/05/05 Javascript
Python中文纠错的简单实现
2021/07/07 Python
Javascript之datagrid查询详解
2021/09/15 Javascript