使用OpenCV-Python为照片添加不同滤镜(每天一个python小项目)

原图如下所示:
在这里插入图片描述

灰度滤镜

import cv2  # 导入OpenCV-Python模块
import os   # 导入文件与系统模块
import numpy as np  # 导入数值计算库

'''
 * 功能:为图片应用灰度滤镜,并且保存图片到指定路径
 * filein:要应用滤镜的图片的路径
 * picture_name:要应用滤镜的图片的文件名
'''
def filter(filein,picture_name):
    imgI_filename = os.path.join(filein,picture_name) # 源文件路径
    imgO_filename = os.path.join(r'G:/code/053/out', picture_name)  # 目标文件路径
    img_rgb = cv2.imread(imgI_filename)  # 读取源图片
    img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY) # 转换为灰度
    # 调整亮度和对比度
    res = np.uint8(np.clip((1.2 * img_gray + 0), 0, 255))
    cv2.imwrite(imgO_filename, res)    # 保存转换后的图片
    ## cv2.imshow('GrayImage',img_cartoon)  # 加预览

if __name__ == '__main__':
    imagelist = [] # 创建空列表
    #循环读取指定路径下的文件名
    for filename in os.listdir(r'G:/code/054/in'):
        imagelist.append(filename)  #将文件名添加到imagelist
        print(filename)
        filter(r'G:/code/054/in',filename)  # 为图片应用灰度滤镜

运行结果:
在这里插入图片描述

素描滤镜

import cv2  # 导入OpenCV-Python模块
import os   # 导入文件与系统模块
import numpy as np  # 导入数值计算库


'''
 * 功能:为图片应用写生素描滤镜,并且保存图片到指定路径
 * filein:要应用滤镜的图片的路径
 * picture_name:要应用滤镜的图片的文件名
'''
def filter(filein,picture_name):
    imgI_filename = os.path.join(filein,picture_name) # 源文件路径
    imgO_filename = os.path.join(r'G:/code/054/out', picture_name)  # 目标文件路径
    img_rgb = cv2.imread(imgI_filename)  # 读取源图片

    num_down = 2   # 缩减像素采样的数目
    num_bilateral = 9 # 定义双边滤波的数目
    # 用高斯金字塔降低取样
    img_color = img_rgb
    for _ in range(num_down):
        img_color = cv2.pyrDown(img_color)
    # 重复使用小的双边滤波代替一个大的滤波
    for _ in range(num_bilateral):
        img_color = cv2.bilateralFilter(img_color,d=4,sigmaColor=8,sigmaSpace=4)
    # 升采样图片到原始大小
    for _ in range(num_down):
        img_color = cv2.pyrUp(img_color)
    img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)  # 转换为灰度
    img_blur = cv2.medianBlur(img_gray, 19)  # 增加模糊效果。值越大越模糊(取奇数)
    # 检测到边缘并且增强其效果
    img_edge = cv2.adaptiveThreshold(img_blur,256,
                                     cv2.ADAPTIVE_THRESH_MEAN_C,
                                     cv2.THRESH_BINARY,
                                     blockSize=9,
                                     C=2)
    img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB) # 彩色图像转为灰度图像
    cv2.imwrite(imgO_filename, img_edge) # 保存图片
    
if __name__ == '__main__':
    imagelist = [] # 创建空列表
    #循环读取指定路径下的文件名
    for filename in os.listdir(r'G:/code/054/in/'):
        imagelist.append(filename)  #将文件名添加到imagelist
        print(filename)
        filter(r'G:/code/054/in/',filename)  # 为图片应用写生素描滤镜

运行结果:
在这里插入图片描述

卡通滤镜

import cv2  # 导入OpenCV-Python模块
import os   # 导入文件与系统模块
import numpy as np  # 导入数值计算库


'''
 * 功能:为图片应用卡通动漫滤镜,并且保存图片到指定路径
 * filein:要应用滤镜的图片的路径
 * picture_name:要应用滤镜的图片的文件名
'''
def filter(filein,picture_name):
    imgI_filename = os.path.join(filein,picture_name) # 源文件路径
    imgO_filename = os.path.join(r'G:/code/054/in', picture_name)  # 目标文件路径
    img_rgb = cv2.imread(imgI_filename)  # 读取图片
    # 转换为灰度并且使其产生中等的模糊
    img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)
    img_blur = cv2.medianBlur(img_gray, 5)  # 值越大越模糊(取奇数)
    #检测到边缘并且增强其效果
    img_edge = cv2.adaptiveThreshold(img_blur,128,
          cv2.ADAPTIVE_THRESH_MEAN_C,
          cv2.THRESH_BINARY,
          blockSize=9,
          C=8)
    img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB) #彩色图像转为灰度图像
    img_cartoon = cv2.bitwise_and(img_rgb, img_edge)  # 灰度图像转为彩色图像
    # 调整亮度和对比度
    res = np.uint8(np.clip((2.0 * img_cartoon + 16), 0, 255))
    # 保存转换后的图片
    cv2.imwrite(imgO_filename, res)

if __name__ == '__main__':
    imagelist = [] # 创建空列表
    #循环读取指定路径下的文件名
    for filename in os.listdir(r'G:/code/054/in'):
        imagelist.append(filename)  #将文件名添加到imagelist
        print(filename)
        filter(r'G:/code/054/in',filename)  # 为图片应用卡通动漫滤镜

运行结果:
在这里插入图片描述

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值