opencv-python图像增强九:ps滤镜实现(二):鱼眼,卡通,素描

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


一,简介

在上文中我们介绍了浮雕,怀旧,水彩这三种滤镜的简介以及如何通过opecv-python进行实现,在本文中我将介绍一下鱼眼滤镜,卡通滤镜,素描滤镜以及对应的算法实现。


二,鱼眼滤镜

2.1简介

鱼眼滤镜是一种特殊的镜头,它能够产生一种极端的视场角,从而创造出非常宽的、扭曲的图像效果。这种效果使得图像的四周呈现出强烈的弯曲和变形,而中心区域则保持相对的直线和正常视角。鱼眼滤镜通常用于摄影,以创造独特的视觉效果,如夸张的广角或一种扭曲的透视感。在数字图像处理中,也可以通过软件模拟鱼眼滤镜的效果,通过拉伸图像的四周来达到类似的扭曲效果。

2.2实现:

首先,获取输入图像的尺寸和通道数,并创建了一个与输入图像尺寸相同的新图像,其中所有像素值被初始化为0。接着,它计算了图像的中心坐标,并确保半径是中心坐标的较小值。然后,通过两层嵌套循环遍历输入图像的每个像素,计算每个像素到中心坐标的距离,并计算新的距离(即距离的平方根)。如果当前像素的距离小于或等于半径的平方,它将当前像素的值替换为与中心距离相同的像素的值。最后,它返回了修改后的图像。通过这个过程,代码模拟了凸透镜效果,即像素值从距离中心较远的像素值转移到距离中心较近的像素值,从而产生了透镜聚焦的效果。

实现代码:

python 复制代码
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实现

首先,读取了一个图像文件。然后,将图像转换为灰度图,并应用中值滤波以减少图像噪声。接着,使用自适应阈值方法来获取图像的边缘。然后,将原始图像通过双边滤波器转换为卡通版本。最后,使用边缘掩码来生成卡通图像,并通过显示原始图像和卡通图像来展示结果。

代码如下(示例):

python 复制代码
# 导入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函数将结果保存为新的图像文件。

代码:

python 复制代码
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()

效果:

相关推荐
曲幽29 分钟前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers
Mintopia1 小时前
OpenClaw 对软件行业产生的影响
人工智能
陈广亮1 小时前
构建具有长期记忆的 AI Agent:从设计模式到生产实践
人工智能
会写代码的柯基犬2 小时前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
Mintopia2 小时前
OpenClaw 是什么?为什么节后热度如此之高?
人工智能
爱可生开源社区2 小时前
DBA 的未来?八位行业先锋的年度圆桌讨论
人工智能·dba
叁两5 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
敏编程5 小时前
一天一个Python库:jsonschema - JSON 数据验证利器
python
前端付豪5 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain