python opencv图像处理(素描、怀旧、光照、流年、滤

1. 简介

Python的OpenCV(Open Source Computer Vision Library,开源计算机视觉库)是一个常用的图像处理库,它提供了大量的算法和工具,让用户能够快速、便捷地处理和分析图像。本文主要介绍如何使用Python的OpenCV对图像进行处理,包括素描、怀旧、光照、流年、滤镜等操作。

2. 环境准备

2.1 安装OpenCV

首先需要安装OpenCV库,可以使用pip命令进行安装:

pip install opencv-python

如果需要安装特定版本的OpenCV,可以指定版本号安装:

pip install opencv-python==4.5.1.48

2.2 导入库

安装完成后,需要导入OpenCV库并引入其他必要的库:

import cv2

import numpy as np

import matplotlib.pyplot as plt

3. 图像处理

3.1 素描

素描是一种艺术形式,它可以将真实世界中的图像转化为黑白图像,使得图片呈现出铅笔画的风格。下面我们将通过OpenCV将一张彩色照片转化为素描图:

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

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

inverted_img = 255 - gray_img

blur_img = cv2.GaussianBlur(inverted_img, (21, 21), 0, 0)

sketch_img = cv2.divide(gray_img, 255 - blur_img, scale=256)

plt.imshow(sketch_img, cmap='gray')

plt.show()

代码解析:

第一行使用cv2.imread()函数读取一张彩色照片。

第二行使用cv2.cvtColor()函数将彩色图像转化为灰度图像。

第三行将灰度图像翻转颜色(变为反色)。

第四行使用cv2.GaussianBlur()函数对反色图像进行高斯模糊。

第五行使用cv2.divide()函数将灰度图像和高斯模糊图像进行除法运算,得到素描效果图。

最后使用plt.imshow()函数和plt.show()函数将素描效果图显示出来,cmap参数设置为'gray',表示以灰度图像方式显示。

3.2 怀旧

怀旧效果可以将彩色图像转化为带有怀旧感觉的图像。下面我们将对照片进行怀旧处理。

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

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 将图片从BGR转换为RGB

height, width, channels = img.shape

new_img = np.zeros((height, width, channels), dtype=np.uint8)

for i in range(height):

for j in range(width):

b, g, r = img[i, j] # 获取当前像素的BGR值

new_b = 0.393 * r + 0.769 * g + 0.189 * b

new_g = 0.349 * r + 0.686 * g + 0.168 * b

new_r = 0.272 * r + 0.534 * g + 0.131 * b

new_img[i, j] = [new_b, new_g, new_r]

plt.imshow(new_img)

plt.show()

代码解析:

第一行使用cv2.imread()函数读取一张彩色照片。

第二行使用cv2.cvtColor()函数将照片从BGR格式转换为RGB格式。

第三行获取图片的高度、宽度和通道数。

第四行使用np.zeros()函数创建一个新的空图像。

第五行使用两层循环遍历每个像素,对每个像素的BGR值进行计算,生成带有怀旧感觉的图像。

最后使用plt.imshow()函数和plt.show()函数将怀旧效果图显示出来。

3.3 光照

光照效果可以将一张图像看起来像是受到光照的影响。下面我们将对照片进行光照处理。

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

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 将图片从BGR转换为RGB

height, width, channels = img.shape

new_img = np.zeros((height, width, channels), dtype=np.uint8)

brightness = 120 # 光照强度

for i in range(height):

for j in range(width):

b, g, r = img[i, j] # 获取当前像素的RGB值

new_b = min(int(b + brightness), 255)

new_g = min(int(g + brightness), 255)

new_r = min(int(r + brightness), 255)

new_img[i, j] = [new_b, new_g, new_r]

plt.imshow(new_img)

plt.show()

代码解析:

第一行使用cv2.imread()函数读取一张彩色照片。

第二行使用cv2.cvtColor()函数将照片从BGR格式转换为RGB格式。

第三行获取图片的高度、宽度和通道数。

第四行使用np.zeros()函数创建一个新的空图像。

第五行定义光照强度。

第六行使用两层循环遍历每个像素,对每个像素的RGB值进行计算,生成具有光照效果的图像。

最后使用plt.imshow()函数和plt.show()函数将光照效果图显示出来。

3.4 流年

流年效果可以将一张彩色照片变成看起来很老的照片。下面我们将对照片进行流年处理。

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

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 将图片从BGR转换为RGB

height, width, channels = img.shape

new_img = np.zeros((height, width, channels), dtype=np.uint8)

for i in range(height):

for j in range(width):

b, g, r = img[i, j] # 获取当前像素的RGB值

new_b = min(0.393 * r + 0.769 * g + 0.189 * b + 40, 255)

new_g = min(0.349 * r + 0.686 * g + 0.168 * b + 40, 255)

new_r = min(0.272 * r + 0.534 * g + 0.131 * b + 40, 255)

new_img[i, j] = [new_b, new_g, new_r]

plt.imshow(new_img)

plt.show()

代码解析:

第一行使用cv2.imread()函数读取一张彩色照片。

第二行使用cv2.cvtColor()函数将照片从BGR格式转换为RGB格式。

第三行获取图片的高度、宽度和通道数。

第四行使用np.zeros()函数创建一个新的空图像。

第五行使用两层循环遍历每个像素,对每个像素的RGB值进行计算,生成具有流年效果的图像。

最后使用plt.imshow()函数和plt.show()函数将流年效果图像显示出来。

3.5 滤镜

下面我们将演示如何使用OpenCV实现两种不同的滤镜效果,包括相框滤镜和卡通滤镜。

相框滤镜

相框滤镜可以在原有的照片上添加边框,使其看起来像是装在相框里的图片。下面我们将使用OpenCV实现相框滤镜效果。

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

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 将图片从BGR转换为RGB

height, width, _ = img.shape

border_size = 50 # 边框大小

border_color = [255, 255, 255] # 边框颜色

new_img = cv2.copyMakeBorder(img, border_size, border_size, border_size, border_size, cv2.BORDER_CONSTANT, value=border_color)

plt.imshow(new_img)

plt.show()

代码解析:

第一行使用cv2.imread()函数读取一张彩色照片。

第二行使用cv2.cvtColor()函数将照片从BGR格式转换为RGB格式。

第三行获取图片的高度、宽度和通道数。

第四行定义边框大小。

第五行定义边框颜色。

第六行使用cv2.copyMakeBorder()函数为照片添加边框。

最后使用plt.imshow()函数和plt.show()函数将添加边框后的照片显示出来。

卡通滤镜

卡通滤镜可以让照片看起来像是画成漫画一样的效果。下面我们将使用OpenCV实现卡通滤镜效果。

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

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 将图片从BGR转换为RGB

gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) # 转换为灰度图像

median_img = cv2.medianBlur(gray_img, 7) # 中值模糊

edge_img = cv2.adaptiveThreshold(median_img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 9) # 边缘检测

color_img = cv2.bilateralFilter(img, 15, 75, 75) # 双边模糊

cartoon_img = cv2.bitwise_and(color_img, color_img, mask=edge_img)

plt.imshow(cartoon_img)

plt.show()

代码解析:

第一行使用cv2.imread()函数读取一张彩色照片。

第二行使用cv2.cvtColor()函数将照片从BGR格式转换为RGB格式。

第三行使用cv2.cvtColor()函数将RGB图像转换为灰度图像。

第四行使用cv2.medianBlur()函数对灰度图像进行中值模糊处理。

第五行使用cv2.adaptiveThreshold()函数对中值模糊后的图像进行边缘检测。

第六行使用cv2.bilateralFilter()函数对彩色图像进行双边模糊处理。

第七行使用cv2.bitwise_and()函数将处理后的边缘掩膜(edge_img)和双边模糊后的彩色图像(color_img)进行按位与处理,得到卡通滤镜后的图像。

最后使用plt.imshow()函数和plt.show()函数将卡通滤镜后的图像显示出来。

4. 总结

通过本文我们学习了如何使用Python的OpenCV对图像进行处理,涉及了素描、怀旧、光照、流年、滤镜等多个方面。通过运用这些技巧,我们可以将平凡的图片处理成具有艺术感的图片。

后端开发标签