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

目录
  • 介绍
  • 形态变换
    • 腐蚀
    • 膨胀
  • 创建边框
  • 强度变换
    • 对数变换
    • 线性变换
  • 去噪彩色图像
  • 使用直方图分析图像

介绍

众所周知,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图像操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • OpenCV-Python 对图像的基本操作代码

    import cv2 as cv import numpy as np import matplotlib.pyplot as plt # 设置兼容中文 plt.rcParams['font.family'] = ['sans-serif'] plt.rcParams['font.sans-serif'] = ['SimHei'] D:\Anaconda\AZWZ\lib\site-packages\numpy\_distributor_init.py:30: UserWarning: load

  • Python Opencv图像处理基本操作代码详解

    1.图像读取 使用cv2.imread(filepath,flags)读入图像 filepath: 读入图像完整路径(绝对路径,相对路径) flags: 读入图像标志 cv2.IMREAD_COLOR:默认参数,读入一副彩色图,忽略alpha通道:可以通过1指定 cv2.IMREAD_GRAYSCALE:读入灰度图片 也通过0指定 cv2.IMREAD_UNCHANGED:读入完整图片,包括alpha通道 import cv2 img1 = cv2.imread('C:/star.png',1)

  • python opencv图像处理基本操作示例详解

    目录 1.图像基本操作 ①读取图像 ②显示图像 ③视频读取 ④图像截取 ⑤颜色通道提取及还原 ⑥边界填充 ⑦数值计算 ⑧图像融合 2.阈值与平滑处理 ①设定阈值并对图像处理 ②图像平滑-均值滤波 ③图像平滑-方框滤波 ④图像平滑-高斯滤波 ⑤图像平滑-中值滤波 3.图像的形态学处理 ①腐蚀操作 ②膨胀操作 ③开运算和闭运算 4.图像梯度处理 ①梯度运算 ②礼帽与黑帽 ③图像的梯度处理 5.边缘检测 ①Canny边缘检测 1.图像基本操作 ①读取图像 ②显示图像 该函数中,name是显示窗口的名字

  • Python OpenCV对图像像素进行操作

    目录 遍历并修改图像像素值 图像的加减乘除运算 遍历并修改图像像素值 在使用opencv处理图像时,有时需要对图像的每个像素点进行处理,比如取反.修改值等操作,就需要通过h和w遍历像素.依然以下图为例: 具体代码: import cv2 as cv import numpy as np def image_pixel(image_path: str): img = cv.imread(image_path, cv.IMREAD_COLOR) cv.imshow('input', img) h,

  • OpenCV-Python实现图像平滑处理操作

    什么是图像平滑处理 在尽量保留图像原有信息的情况下,过滤掉图像内部的噪声,这一过程我们称之为图像的平滑处理,所得到的图像称为平滑图像. 那么什么是图像的噪声呢? 图像的噪声就是图像中与周围像素点差异较大的像素点.噪声的处理就是将其更改为临近像素点的近似值,使图像更平滑. 图像平滑处理的噪声取值的方式有以下6种: (1)均值滤波 (2)方框滤波 (3)高斯滤波 (4)中值滤波 (5)双边滤波 (6)2D卷积(自定义滤波) 均值滤波 均值滤波是指用当前像素点周围N*N个像素点的均值来代替当前像素值.

  • 深入学习Python+Opencv常用四种图像处理操作

    目录 改变色彩空间: cv.cvtColor() 改变图像大小:cv.resize() 二维卷积操作 常用模糊 opencv图像处理(深度学习中常用的) 改变色彩空间: cv.cvtColor() cv.cvtColor(img, flag) img:原图像 flag:要改变的类型 常用的flag有:cv.COLOR_BGR2GRAY (BGR->GRAY).cv.COLOR_BGR2HSV img = cv.imread(r'E:\0_postgraduate\test.jpg') gray

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

    目录 介绍 形态变换 腐蚀 膨胀 创建边框 强度变换 对数变换 线性变换 去噪彩色图像 使用直方图分析图像 介绍 众所周知,OpenCV是一个用于计算机视觉和图像操作的免费开源库. OpenCV 是用 C++ 编写的,并且有数千种优化的算法和函数用于各种图像操作.很多现实生活中的操作都可以使用 OpenCV 来解决.例如视频和图像分析.实时计算机视觉.对象检测.镜头分析等. 许多公司.研究人员和开发人员为 OpenCV 的创建做出了贡献.使用OpenCV 很简单,而且 OpenCV 配备了许多工

  • 详解python opencv图像混合算术运算

    目录 图片相加 cv2.add() 按位运算 图片相加 cv2.add() 要叠加两张图片,可以用 cv2.add() 函数,相加两幅图片的形状(高度 / 宽度 / 通道数)必须相同.         numpy中可以直接用res = img + img1相加,但这两者的结果并不相同(看下边代码):         add()两个图片进行加和,大于255的使用255计数.         numpy会对结果取256(相当于255+1)的模: import numpy as np import c

  • 详解Python+OpenCV实现图像二值化

    目录 一.图像二值化 1.效果 2.源码 二.图像二值化(调节阈值) 1.源码一 2.源码二 一.图像二值化 1.效果 2.源码 import cv2 import numpy as np import matplotlib.pyplot as plt # img = cv2.imread('test.jpg') #这几行是对图像进行降噪处理,但事还存在一些问题. # dst = cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21) # plt

  • 详解Python OpenCV图像分割算法的实现

    目录 前言 1.图像二值化 2.自适应阈值分割算法 3.Otsu阈值分割算法 4.基于轮廓的字符分离 4.1轮廓检测 4.2轮廓绘制 4.3包围框获取 4.4矩形绘制 前言 图像分割是指根据灰度.色彩.空间纹理.几何形状等特征把图像划分成若干个互不相交的区域. 最简单的图像分割就是将物体从背景中分割出来 1.图像二值化 cv2.threshold是opencv-python中的图像二值化方法,可以实现简单的分割功能. retval, dst = cv2.threshold(src, thresh

  • 详解Python+opencv裁剪/截取图片的几种方式

    前言 在计算机视觉任务中,如图像分类,图像数据集必不可少.自己采集的图片往往存在很多噪声或无用信息会影响模型训练.因此,需要对图片进行裁剪处理,以防止图片边缘无用信息对模型造成影响.本文介绍几种图片裁剪的方式,供大家参考. 一.手动单张裁剪/截取 selectROI:选择感兴趣区域,边界框框选x,y,w,h selectROI(windowName, img, showCrosshair=None, fromCenter=None): . 参数windowName:选择的区域被显示在的窗口的名字

  • 详解Python OpenCV数字识别案例

    前言 实践是检验真理的唯一标准. 因为觉得一板一眼地学习OpenCV太过枯燥,于是在网上找了一个以项目为导向的教程学习.话不多说,动手做起来. 一.案例介绍 提供信用卡上的数字模板: 要求:识别出信用卡上的数字,并将其直接打印在原图片上.虽然看起来很蠢,但既然可以将数字打印在图片上,说明已经成功识别数字,因此也可以将其转换为数字文本保存.车牌号识别等项目的思路与此案例类似. 示例: 原图 处理后的图 二.步骤 大致分为如下几个步骤: 1.模板读入 2.模板预处理,将模板数字分开,并排序 3.输入

  • 详解Python调用华为API实现图像标签

    目录 1.华为云API介绍 1.1 华为云图像标签 1.2 应用场景 1.3 调用华为云API实现图像标签 2.实验过程 2.1实验代码 2.2运行结果 2.3 问题注释 1.华为云API介绍 1.1 华为云图像标签 可识别上千种通用物体以及数百种场景标签,一个图像可包含多个标签内容,语义内容非常丰富.更智能.准确的理解图像内容,让智能相册管理.照片检索和分类.基于场景内容或者物体的广告推荐等功能更加准确. 1.2 应用场景 1.场景分析 图像标签功能可准确识别视频.图像内容,提高检索效率和精度

  • 详解Python中键盘鼠标的相关操作

    目录 一.前言 二.pyautogui模块 三.鼠标相关操作 1.鼠标移动 2.获取鼠标位置 3.鼠标点击 4.按松鼠标 5.拖动窗口 6.上下滑动 7.小程序——鼠标操控术2.0 8.小程序——连点器 四.键盘相关操作 1.按键的按松 2.键入字符串 3.热键 4.小程序——轰炸器 5.小程序——520个我爱你 五.尾声 一.前言 恭喜你,学明白类,你已经学会所有基本知识了. 这章算是一个娱乐篇,十分简单,了解一下pyautogui模块,这算是比较好学还趣味性十足的,而且可以做许多小程序. 本

  • 详解python中的文件与目录操作

    详解python中的文件与目录操作 一 获得当前路径 1.代码1 >>>import os >>>print('Current directory is ',os.getcwd()) Current directory is D:\Python36 2.代码2 如果将上面的脚本写入到文件再运行 Current directory is E:\python\work 二 获得目录的内容 Python代码 >>> os.listdir (os.getcwd

  • 详解python的xlwings库读写excel操作总结

    一.总结(点击显示或隐藏总结内容) 一句话总结: xlwings 是 Python 中操作Excel的一个第三方库,支持.xls读写,.xlsx读写,操作非常简单,功能也很强大 1.xlwings 中的逻辑:应用->工作簿->工作表->范围 对应的代码? 应用:一个应用(一个xlwings程序):app = xw.App(visible=True, add_book=False) 工作簿(book):excel文件(excel程序):wb = app.books.add() 工作表(sh

随机推荐