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()

效果:

相关推荐
stormsha4 分钟前
go-rod vs Selenium:自动化测试工具的比较与选择
python·selenium·测试工具·golang
逝去的紫枫6 分钟前
Python Selenium:Web自动化测试与爬虫开发
开发语言·python·selenium
SUN_Gyq9 分钟前
什么是 C++ 中的模板特化和偏特化? 如何进行模板特化和偏特化?
开发语言·c++·算法
码上一元13 分钟前
【百日算法计划】:每日一题,见证成长(026)
算法
愿天垂怜20 分钟前
【C++】C++11引入的新特性(1)
java·c语言·数据结构·c++·算法·rust·哈希算法
南门听露25 分钟前
无监督跨域目标检测的语义一致性知识转移
人工智能·目标检测·计算机视觉
夏沫の梦26 分钟前
常见LLM大模型概览与详解
人工智能·深度学习·chatgpt·llama
平头哥在等你28 分钟前
python特殊字符序列
开发语言·python·正则表达式
kitesxian30 分钟前
Leetcode200. 岛屿数量(HOT100)
算法·深度优先
LNTON羚通36 分钟前
算法定制LiteAIServer视频智能分析平台工业排污检测算法智控环保监管
算法·目标检测·音视频·监控·视频监控