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对图像进行处理,涉及了素描、怀旧、光照、流年、滤镜等多个方面。通过运用这些技巧,我们可以将平凡的图片处理成具有艺术感的图片。