提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一,简介
在上文中我们介绍了浮雕,怀旧,水彩这三种滤镜的简介以及如何通过opecv-python进行实现,在本文中我将介绍一下鱼眼滤镜,卡通滤镜,素描滤镜以及对应的算法实现。
二,鱼眼滤镜
2.1简介
鱼眼滤镜是一种特殊的镜头,它能够产生一种极端的视场角,从而创造出非常宽的、扭曲的图像效果。这种效果使得图像的四周呈现出强烈的弯曲和变形,而中心区域则保持相对的直线和正常视角。鱼眼滤镜通常用于摄影,以创造独特的视觉效果,如夸张的广角或一种扭曲的透视感。在数字图像处理中,也可以通过软件模拟鱼眼滤镜的效果,通过拉伸图像的四周来达到类似的扭曲效果。
2.2实现:
首先,获取输入图像的尺寸和通道数,并创建了一个与输入图像尺寸相同的新图像,其中所有像素值被初始化为0。接着,它计算了图像的中心坐标,并确保半径是中心坐标的较小值。然后,通过两层嵌套循环遍历输入图像的每个像素,计算每个像素到中心坐标的距离,并计算新的距离(即距离的平方根)。如果当前像素的距离小于或等于半径的平方,它将当前像素的值替换为与中心距离相同的像素的值。最后,它返回了修改后的图像。通过这个过程,代码模拟了凸透镜效果,即像素值从距离中心较远的像素值转移到距离中心较近的像素值,从而产生了透镜聚焦的效果。
实现代码:
import cv2
import numpy as np
import math
def Filter_Tutoujing(src_img): #凸透镜
"""
这个函数接受一个名为src_img的输入图像,并返回一个修改后的图像,模拟了凸透镜的效果。
"""
# 获取输入图像的行数(row)、列数(col)和通道数(channel)
row = src_img.shape[0]
col = src_img.shape[1]
channel = src_img.shape[2]
# 创建一个与输入图像尺寸相同的新图像new_img,所有像素值初始化为0
new_img = np.zeros([row, col, channel], dtype=np.uint8)
# 计算图像的中心坐标(center_x和center_y)
center_x = row / 2
center_y = col / 2
# 计算半径radius,这里使用了min函数来确保半径是中心坐标的较小值
radius = min(center_x, center_y)
# 使用两层嵌套循环遍历输入图像的每个像素
for i in range(row):
for j in range(col):
# 计算当前像素到图像中心的距离distance
distance = ((i - center_x) * (i - center_x) + (j - center_y) * (j - center_y))
# 计算新的距离new_dist,即distance的平方根
new_dist = math.sqrt(distance)
# 先将当前像素的值复制到new_img中
new_img[i, j, :] = src_img[i, j, :]
# 如果当前像素的距离小于或等于半径的平方,则进行透镜效果的处理
if distance <= radius ** 2:
# 计算新的像素坐标new_i和new_j
new_i = int(np.floor(new_dist * (i - center_x) / radius + center_x))
new_j = int(np.floor(new_dist * (j - center_y) / radius + center_y))
# 将new_i和new_j坐标上的像素值复制到new_img的当前位置
new_img[i, j, :] = src_img[new_i, new_j, :]
# 返回修改后的图像new_img
return new_img
src_img_name='F:\im/1.jpg'
src_img=cv2.imread(src_img_name)
new_img=Filter_Tutoujing(src_img)
cv2.imshow('src',src_img)
cv2.imshow('tutoujing',new_img)
cv2.waitKey()
效果:
三,卡通滤镜
3.1简介
卡通滤镜通过锐化边缘、简化颜色、调整饱和度和增强对比度来模拟卡通画的特点,从而改变图像的外观。这种滤镜常用于摄影、社交媒体和艺术创作,为现代图像增添卡通风格,并通过数字技术轻松应用于数码照片,使其瞬间拥有卡通画的美感。
3.2实现
首先,读取了一个图像文件。然后,将图像转换为灰度图,并应用中值滤波以减少图像噪声。接着,使用自适应阈值方法来获取图像的边缘。然后,将原始图像通过双边滤波器转换为卡通版本。最后,使用边缘掩码来生成卡通图像,并通过显示原始图像和卡通图像来展示结果。
代码如下(示例):
# 导入OpenCV库
import cv2
# 使用cv2加载图像
img = cv2.imread(r"F:\im\1.jpg")
# 将图像转换为灰度图,并应用中值滤波以减少图像噪声
grayimg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
grayimg = cv2.medianBlur(grayimg, 5)
# 获取图像的边缘
edges = cv2.adaptiveThreshold(grayimg, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 5)
# 将图像转换为卡通版本
color = cv2.bilateralFilter(img, 9, 250, 250)
# 使用边缘掩码来生成卡通图像
cartoon = cv2.bitwise_and(color, color, mask=edges)
# 显示原始图像
cv2.imshow('Original Image', img)
# 显示卡通图像
cv2.imshow('Cartoon Image', cartoon)
# 等待按键事件,然后关闭所有OpenCV窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
效果:
四:素描滤镜
4.1 简述
素描滤镜通过强调线条和阴影、简化色彩、添加纹理和质感以及锐化边缘,模拟铅笔或炭笔绘制的素描效果,使图像呈现出一种手绘艺术风格。这种滤镜常用于摄影、社交媒体和艺术创作中,为现代图像增添一种艺术和手绘的感觉。通过数字技术,素描滤镜可以轻松应用于数码照片,让现代图像瞬间拥有素描滤镜的效果。
4.2 实现;
首先使用OpenCV库的cv2.imread函数读取了一个灰度图像,并使用cv2.Sobel函数计算了图像的水平和垂直梯度。接着,它定义了一个深度值,并根据该值归一化梯度。随后,它计算了光源参数,并使用这些参数计算了光照效果。最后,它将光照效果应用于原始图像,并重构了图像。通过OpenCV的cv2.imshow函数在窗口中显示了结果图像,并使用cv2.imwrite函数将结果保存为新的图像文件。
代码:
import cv2
import numpy as np
# 读取图像
image = cv2.imread(r'F:\im/1.jpg', cv2.IMREAD_GRAYSCALE)
# 确保图像尺寸正确,如果图像尺寸不正确,可能需要调整以下代码
# image = cv2.resize(image, (image.shape[1] * 2, image.shape[0] * 2))
# 定义深度值
depth = 10. # (0-100)
# 计算梯度
grad_x = cv2.Sobel(image, cv2.CV_32F, 1, 0, ksize=3)
grad_y = cv2.Sobel(image, cv2.CV_32F, 0, 1, ksize=3)
# 归一化梯度
grad_x = grad_x * depth / 2000.
grad_y = grad_y * depth / 2000.
A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
uni_x = grad_x / A
uni_y = grad_y / A
uni_z = 1. / A
# 光源参数
vec_el = np.pi / 2.2 # 光源的俯视角度,弧度值
vec_az = np.pi / 4. # 光源的方位角度,弧度值
dx = np.cos(vec_el) * np.cos(vec_az) # 光源对x 轴的影响
dy = np.cos(vec_el) * np.sin(vec_az) # 光源对y 轴的影响
dz = np.sin(vec_el) # 光源对z 轴的影响
# 计算光照效果
b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z)
b = b.clip(0, 255)
# 重构图像
im = b.astype('uint8')
# 显示结果
cv2.imshow('Handdrawn Effect', im)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果: