提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一,简介:
滤镜,在数字图像处理领域,指的是一系列算法或程序,它们能够对数字图像进行分析和修改,以增强、减弱或改变图像的某些特性。滤镜的作用通常是为了改善图像质量、实现特定的视觉效果或提取图像中的特定信息。本项目旨在利用OpenCV这一强大的计算机视觉库,复现Photoshop中流行的滤镜效果。通过深入研究图像处理算法,我们将实现一系列高质量的滤镜本次实现的滤镜为浮雕滤镜,怀旧滤镜,水彩滤镜.
二,浮雕滤镜:
2.1 简介:
浮雕滤镜是一种图像处理技术,它通过模拟光照和阴影效果来为图像赋予三维立体感,这种效果在灰度图像上尤为常见,同时也能应用于彩色图像。其主要特点包括立体感,这是通过突出图像的边缘和细节来形成物体仿佛从背景中突出或陷入的错觉;光照效果,它模拟从特定方向照射的光线,让物体的一部分显得更亮,而另一部分则相对暗淡;以及阴影与高光,这些效果在物体边缘的暗侧形成阴影,在亮侧则产生高光,从而进一步强化了图像的立体效果。
2.2 实现:
算法的流程是首先创建一个与原始图像尺寸相同的三通道全零数组img_Fudiao,用于存储浮雕效果的结果。接着,通过两层嵌套循环遍历图像的每个像素点(除了最后一列),计算当前像素点与其右侧隔一个像素点的灰度值之差,并加上150以增强立体感。计算得到的差值被限制在0到255的范围内,以防止像素值溢出,然后将这个新计算的像素值赋给img_Fudiao的对应位置,最终形成具有浮雕效果的图像。
代码:
# 初始化一个与原始图像尺寸相同的三通道图像数组,用于存储浮雕效果,数据类型为无符号8位整数
img_Fudiao = np.zeros((h, w, 3), np.uint8)
# 遍历图像的高度
for i in range(0, h):
# 遍历图像的宽度,减2以避免在计算时索引越界
for j in range(0, w - 2):
# 获取当前像素点的灰度值
grayP0 = int(gray[i, j])
# 获取右侧隔一个像素点的灰度值,以计算差值
grayP1 = int(gray[i, j + 2]) # 取与前一个像素点相邻的点
# 计算当前像素点与相邻像素点的灰度值之差,并加上150以增强立体感
newP = grayP0 - grayP1 + 150
# 如果计算结果大于255,则将其限制为255,防止像素值溢出
if newP > 255:
newP = 255
# 如果计算结果小于0,则将其限制为0,防止像素值溢出
if newP < 0:
newP = 0
# 将计算后的新像素值赋给浮雕图像的当前位置
img_Fudiao[i, j] = newP
效果:
三,怀旧滤镜:
3.1 简介:
怀旧滤镜是一种图像处理效果,它通过降低图像的整体饱和度、增加黄色、棕色或橙色色调来模拟旧照片的颜色变化,同时减少对比度以营造柔和感,仿佛图像经过长时间的光照和褪色;此外,它还可能叠加纹理效果如颗粒感、划痕或折痕,模仿旧照片的物理损伤,并在高光区域添加轻微光晕,模拟老式相机镜头的光学效果。这种滤镜常用于摄影、社交媒体和艺术创作,为现代图像增添一种时间流逝和回忆的氛围,通过数字技术轻松应用于数码照片,使之瞬间拥有复古的魅力。
3.2 实现:
首先获取图像的尺寸和通道数。接着,通过两层嵌套循环遍历图像的每个像素,获取当前像素的BGR值,并应用复古颜色变换。在变换过程中,对每个颜色通道的值进行过限检查,确保像素值在0到255之间。最后,将计算后的像素值赋给图像的对应位置,并返回处理后的图像。
代码实现:
import cv2
import numpy as np
def apply_retro_filter(image):
# 打印"复古滤镜"
print("复古滤镜")
# 获取图像尺寸和通道数
height = image.shape[0]
width = image.shape[1]
channels = image.shape[2]
print("channels : ", channels)
print("image shape:", image.shape)
# 遍历图像的每个像素
for row in range(height):
for col in range(width):
# 获取当前像素的BGR值
blue = image[row, col, 0]
green = image[row, col, 1]
red = image[row, col, 2]
# 应用复古颜色变换
r = (0.393 * red + 0.669 * green + 0.049 * blue)
g = (0.349 * red + 0.686 * green + 0.048 * blue)
b = (0.272 * red + 0.534 * green + 0.011 * blue)
# 过限检查,确保像素值在0-255之间
r = min(max(int(r), 0), 255)
g = min(max(int(g), 0), 255)
b = min(max(int(b), 0), 255)
# 更新像素值
image[row, col, 0] = b
image[row, col, 1] = g
image[row, col, 2] = r
return image
# 读取图像
image = cv2.imread(r'F:\im/1.jpg')
# 应用怀旧滤镜
nostalgia_image = apply_retro_filter(image.copy())
# 显示原图和怀旧效果图像
cv2.imshow('Original Image', image)
cv2.imshow('Nostalgia Filtered Image', nostalgia_image)
# 等待按键后退出
cv2.waitKey(0)
cv2.destroyAllWindows()
四,水彩滤镜:
4.1 简介:
水彩滤镜是一种图像处理效果,通过模拟水彩画的特点来改变图像的外观,包括颜色晕染、笔触纹理、色彩混合和透明度控制,以增添艺术感和自然美,常用于摄影、社交媒体和艺术创作,通过数字技术轻松应用于数码照片,让现代图像瞬间拥有水彩画的美感。
4.2 实现:
实现图像水彩滤镜使用opencv自带函数cv2.stylization,cv2.stylization 函数通过计算图像的局部区域和全局区域的特征,然后将这些特征应用于输入的图像,从而得到具有艺术风格的图像。
该函数有两个参数:
● image:输入的图像。
● sigma_s 和 sigma_r:控制风格化的程度和风格化区域的局部大小。
sigma_s 参数控制风格化区域的局部大小,它决定了局部区域中哪些像素点会被考虑在内。较大的 sigma_s 值会导致较大的局部区域,而较小的 sigma_s 值则会导致较小的局部区域。
sigma_r 参数控制风格化区域的范围大小,它决定了局部区域内哪些像素点会被用于计算风格化效果。较大的 sigma_r 值会导致较大的风格化区域,而较小的 sigma_r 值则会导致较小的风格化区域。
实现代码:
import cv2
import numpy as np
# 读取图像
image = cv2.imread(r'F:\im/1.jpg')
# 应用水彩滤镜
res= cv2.stylization(image, sigma_s=100, sigma_r=1)
# 显示原图和怀旧效果图像
cv2.imshow('Original Image', image)
cv2.imshow('Nostalgia Filtered Image', res)
# 等待按键后退出
cv2.waitKey(0)
cv2.destroyAllWindows()
效果: