python图像处理 —— 实现图像滤镜效果

python图像处理 —— 实现图像滤镜效果

  • 前言
  • 一、浮雕
  • 二、素描
  • 三、怀旧
  • 四、水彩画
  • 五、水波
  • 六、卡通
  • 七、流年
  • 八、美颜
  • 完整代码

前言

随着数字图像处理技术的不断发展,越来越多的人开始关注图像滤镜的应用。其中,使用Python的Opencv库实现图像滤镜效果成为了一种流行的技术手段。而图像滤镜是一种可以改变图像外观和色彩的技术,可以帮助我们创建独特的视觉效果。在本文中,我们将介绍如何使用Python和Opencv实现图像滤镜效果,为读者提供一个简单的入门指南。

一、浮雕

图像浮雕原理是通过对图像进行灰度变换,使得某些局部区域的像素值相对于周围像素值有一定的增加或减少,从而使得图像呈现出明显的浮雕感觉。具体来说,浮雕效果的实现可以通过以下步骤:

(1)将彩色图像转换为灰度图像。
(2)对灰度图像进行卷积操作,使用卷积核进行滤波,得到一组新的像素值。卷积核的大小可以根据需要进行调整,通常采用3x3或5x5的大小。
(3)对于每个像素,将卷积操作后得到的像素值减去该像素在原始图像中的像素值,得到浮雕值。
(4)根据浮雕值,将像素点的灰度值进行调整,使得局部区域的像素值相对于周围的像素值有一定的增加或减少。
(5)将处理后的像素值重新映射到0-255的灰度值范围内,生成浮雕效果的图像。

# ===============================图像浮雕处理===============================
img_Fudiao = np.zeros((h, w, 3), np.uint8)
for i in range(0, h):for j in range(0, w - 2):              # 减2的效果和上面一样grayP0 = int(gray[i, j])grayP1 = int(gray[i, j + 2])        # 取与前一个像素点相邻的点newP = grayP0 - grayP1 + 150       # 得到差值,加一个 150 常数可以增加浮雕立体感if newP > 255:  # 新的像素值,防止像素溢出newP = 255if newP < 0:    # 新的像素值,防止像素溢出newP = 0img_Fudiao[i, j] = newP

二、素描

通过滤波、边缘检测、二值化可以将将一幅RGB图像转换成素描

#  ===============================图像素描处理==================================
gaussian = cv2.GaussianBlur(gray, (3, 3), 0)  # 通过高斯滤波过滤噪声
# 通过canny算法提取图像轮过
canny = cv2.Canny(gaussian, 50, 140)
# 对轮廓图像进行反二进制阈值化处理
ret, img_Sumiao = cv2.threshold(canny, 50, 255, cv2.THRESH_BINARY_INV)

三、怀旧

将一幅RGB图像转为怀旧图像的基本原理是将原始图像的颜色进行调整,使其呈现出类似老照片的色调。

# ===============================图像怀旧处理===============================
img_old = np.zeros((h, w, 3), dtype=img.dtype)
# 通过对原始图像进行遍历,通过怀旧公式修改像素值,然后进行怀旧处理
for i in range(h):for j in range(w):B = 0.272 * img[i, j][2] + 0.534 * img[i, j][1] + 0.131 * img[i, j][0]G = 0.349 * img[i, j][2] + 0.686 * img[i, j][1] + 0.168 * img[i, j][0]R = 0.393 * img[i, j][2] + 0.769 * img[i, j][1] + 0.189 * img[i, j][0]# 防止图像溢出if B > 255:B = 255if G > 255:G = 255if R > 255:R = 255img_old[i, j] = [int(R), int(G), int(B)]  # B\G\R三通道都设置为怀旧值

四、水彩画

cv2.stylization是OpenCV库中的一种图像风格化函数,它可以用于将图像转换为带有不同风格的艺术作品。该函数的实现基于快速风格迁移(Fast Style Transfer)技术,可以在短时间内将一张普通照片转化为梵高,毕加索或印象派等多种不同风格的艺术作品。

# ===============================图像水彩画效果处理===============================
"""
src:需要进行风格化的原始图像。
sigma_s:控制空间域滤波器的尺度,通常取值在0到200之间,数值越大则滤波器的尺度越大,图像的细节信息会被平滑处理。
sigma_r:控制像素值域滤波器的尺度,通常取值在0到1之间,数值越小则滤波器的尺度越小,图像的细节信息会被保留。
"""
img_color = cv2.stylization(img, sigma_s=60, sigma_r=0.6)

五、水波

添加水波特效的原理是通过对RGB图像进行仿射变换和图像处理,使图像呈现出波动效果。

# ===============================水波特效===============================
img_wave = np.zeros((h, w, 3), np.uint8)
wavelength = 30                                 #定义水波特效波长
amplitude = 20                                  #幅度
phase = math.pi / 4                             #相位
centreX = 0.5                                   #水波中心点X
centreY = 0.5                                   #水波中心点Y
radius = min(h, w) / 2
icentreX = w*centreX                            #水波覆盖宽度
icentreY = h*centreY                            #水波覆盖高度
for i in range(0, h):for j in range(0, w):dx = j - icentreXdy = i - icentreYdistance = dx * dx + dy * dyif distance > radius * radius:x = jy = ielse:# 计算水波区域distance = math.sqrt(distance)amount = amplitude * math.sin(distance / wavelength * 2 * math.pi - phase)amount = amount * (radius - distance) / radiusamount = amount * wavelength / (distance + 0.0001)x = j + dx * amounty = i + dy * amount# 边界判断if x < 0:x = 0if x >= w - 1:x = w - 2if y < 0:y = 0if y >= h - 1:y = h - 2p = x - int(x)q = y - int(y)# 图像水波赋值img_wave[i, j, :] = (1 - p) * (1 - q) * img[int(y), int(x), :] + p * (1 - q) * img[int(y), int(x), :]+ (1 - p) * q * img[int(y), int(x), :] + p * q * img[int(y), int(x), :]
img_wave = cv2.cvtColor(img_wave, cv2.COLOR_BGR2RGB)

六、卡通

将一幅RGB图像添加卡通特效的原理是将图像进行多次模糊、锐化、边缘检测等处理,使得图像呈现出光滑的颜色渐变和明显的边缘线条,从而使得图像具有卡通般的效果。

# ===============================卡通特效===============================
img_blur = cv2.medianBlur(gray, 7)                     # 中值滤波处理
img_edge = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, blockSize = 5, C = 2) #边缘检测及自适应阈值化处理
img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB)  # 转换回彩色图像
img_cartoon = cv2.bitwise_and(img, img_edge)          # 图像的与运算
img_cartoon = cv2.cvtColor(img_cartoon, cv2.COLOR_BGR2RGB)

七、流年

添加流年特效是一种常见的图像处理操作,它可以使一幅RGB图像呈现出类似老照片的效果。实现流年特效的主要原理是通过对图像的色彩、亮度、对比度等进行调整,使得图像呈现出一种偏暗、偏黄、颗粒状的效果。

# ===============================流年特效===============================
img_nian = np.zeros((h, w, 3), np.uint8)
for i in range(0, h):for j in range(0, w):B = math.sqrt(img[i, j][0]) *14       # B通道的数值开平方乘以参数14G = img[i, j][1]R = img[i, j][2]if B > 255:B = 255img_nian[i, j] = np.uint8((B, G, R))
img_nian = cv2.cvtColor(img_nian, cv2.COLOR_BGR2RGB)

八、美颜

美颜本质上就是双边滤波,函数 cv2.bilateralFilter() 能在保持边界清晰的情况下有效的去除噪音,就是人脸上的痘痘,所以有美颜效果

# ===============================美颜===============================
img_bit = cv2.bilateralFilter(src=img, d=0, sigmaColor=30, sigmaSpace=15)
img_bit = cv2.cvtColor(img_bit, cv2.COLOR_BGR2RGB)

在这里插入图片描述

完整代码

# -*- coding:utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
import math
plt.rcParams['font.family'] = 'SimHei'
img = cv2.imread('bin.png')
img_Org = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
h, w = img.shape[:2]
# ===============================图像浮雕处理===============================
img_Fudiao = np.zeros((h, w, 3), np.uint8)
for i in range(0, h):for j in range(0, w - 2):              # 减2的效果和上面一样grayP0 = int(gray[i, j])grayP1 = int(gray[i, j + 2])        # 取与前一个像素点相邻的点newP = grayP0 - grayP1 + 150       # 得到差值,加一个 150 常数可以增加浮雕立体感if newP > 255:  # 新的像素值,防止像素溢出newP = 255if newP < 0:    # 新的像素值,防止像素溢出newP = 0img_Fudiao[i, j] = newP#  ===============================图像素描处理==================================
gaussian = cv2.GaussianBlur(gray, (3, 3), 0)  # 通过高斯滤波过滤噪声
# 通过canny算法提取图像轮过
canny = cv2.Canny(gaussian, 50, 140)
# 对轮廓图像进行反二进制阈值化处理
ret, img_Sumiao = cv2.threshold(canny, 50, 255, cv2.THRESH_BINARY_INV)# ===============================图像怀旧处理===============================
img_old = np.zeros((h, w, 3), dtype=img.dtype)
# 通过对原始图像进行遍历,通过怀旧公式修改像素值,然后进行怀旧处理
for i in range(h):for j in range(w):# B = 0.131 * img[i, j, 0] + 0.534 * img[i, j, 1] + 0.272 * img[i, j, 2]# G = 0.168 * img[i, j, 0] + 0.686 * img[i, j, 1] + 0.349 * img[i, j, 2]# R = 0.189 * img[i, j, 0] + 0.769 * img[i, j, 1] + 0.393 * img[i, j, 2]B = 0.272 * img[i, j][2] + 0.534 * img[i, j][1] + 0.131 * img[i, j][0]G = 0.349 * img[i, j][2] + 0.686 * img[i, j][1] + 0.168 * img[i, j][0]R = 0.393 * img[i, j][2] + 0.769 * img[i, j][1] + 0.189 * img[i, j][0]# 防止图像溢出if B > 255:B = 255if G > 255:G = 255if R > 255:R = 255img_old[i, j] = [int(R), int(G), int(B)]  # B\G\R三通道都设置为怀旧值# ===============================图像水彩画效果处理===============================
"""
src:需要进行风格化的原始图像。
sigma_s:控制空间域滤波器的尺度,通常取值在0到200之间,数值越大则滤波器的尺度越大,图像的细节信息会被平滑处理。
sigma_r:控制像素值域滤波器的尺度,通常取值在0到1之间,数值越小则滤波器的尺度越小,图像的细节信息会被保留。
"""
img_color = cv2.stylization(img, sigma_s=60, sigma_r=0.6)
img_color = cv2.cvtColor(img_color, cv2.COLOR_BGR2RGB)# ===============================水波特效===============================
img_wave = np.zeros((h, w, 3), np.uint8)
wavelength = 30                                 #定义水波特效波长
amplitude = 20                                  #幅度
phase = math.pi / 4                             #相位
centreX = 0.5                                   #水波中心点X
centreY = 0.5                                   #水波中心点Y
radius = min(h, w) / 2
icentreX = w*centreX                            #水波覆盖宽度
icentreY = h*centreY                            #水波覆盖高度
for i in range(0, h):for j in range(0, w):dx = j - icentreXdy = i - icentreYdistance = dx * dx + dy * dyif distance > radius * radius:x = jy = ielse:# 计算水波区域distance = math.sqrt(distance)amount = amplitude * math.sin(distance / wavelength * 2 * math.pi - phase)amount = amount * (radius - distance) / radiusamount = amount * wavelength / (distance + 0.0001)x = j + dx * amounty = i + dy * amount# 边界判断if x < 0:x = 0if x >= w - 1:x = w - 2if y < 0:y = 0if y >= h - 1:y = h - 2p = x - int(x)q = y - int(y)# 图像水波赋值img_wave[i, j, :] = (1 - p) * (1 - q) * img[int(y), int(x), :] + p * (1 - q) * img[int(y), int(x), :]+ (1 - p) * q * img[int(y), int(x), :] + p * q * img[int(y), int(x), :]
img_wave = cv2.cvtColor(img_wave, cv2.COLOR_BGR2RGB)# ===============================卡通特效===============================
img_blur = cv2.medianBlur(gray, 7)                     # 中值滤波处理
img_edge = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, blockSize = 5, C = 2) #边缘检测及自适应阈值化处理
img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB)  # 转换回彩色图像
img_cartoon = cv2.bitwise_and(img, img_edge)          # 图像的与运算
img_cartoon = cv2.cvtColor(img_cartoon, cv2.COLOR_BGR2RGB)# ===============================流年特效===============================
img_nian = np.zeros((h, w, 3), np.uint8)
for i in range(0, h):for j in range(0, w):B = math.sqrt(img[i, j][0]) *14       # B通道的数值开平方乘以参数14G = img[i, j][1]R = img[i, j][2]if B > 255:B = 255img_nian[i, j] = np.uint8((B, G, R))
img_nian = cv2.cvtColor(img_nian, cv2.COLOR_BGR2RGB)
# ===============================美颜===============================
img_bit = cv2.bilateralFilter(src=img, d=0, sigmaColor=30, sigmaSpace=15)
img_bit = cv2.cvtColor(img_bit, cv2.COLOR_BGR2RGB)plt.figure(figsize=(16,9))
plt.subplot(331),plt.imshow(img_Org), plt.xticks([]), plt.yticks([]), plt.title('原图')
plt.subplot(332),plt.imshow(img_Fudiao, cmap='gray'), plt.xticks([]), plt.yticks([]), plt.title('浮雕')
plt.subplot(333),plt.imshow(img_Sumiao, cmap='gray'), plt.xticks([]), plt.yticks([]), plt.title('素描')
plt.subplot(334),plt.imshow(img_old), plt.xticks([]), plt.yticks([]), plt.title('怀旧')
plt.subplot(335),plt.imshow(img_color), plt.xticks([]), plt.yticks([]), plt.title('水彩')
plt.subplot(336),plt.imshow(img_wave), plt.xticks([]), plt.yticks([]), plt.title('水波')
plt.subplot(337),plt.imshow(img_cartoon), plt.xticks([]), plt.yticks([]), plt.title('卡通')
plt.subplot(338),plt.imshow(img_nian), plt.xticks([]), plt.yticks([]), plt.title('流年')
plt.subplot(339),plt.imshow(img_bit), plt.xticks([]), plt.yticks([]), plt.title('美颜')
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/162668.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设置IDEA快捷生成方法头,类头注释

1.File->settings->editor->live templates进入Live Template界面进行设置&#xff1a; 下一步&#xff1a; 下一步&#xff1a; /*** Title: $title$* author: sunyanzeng* date: $datatime$*/在需要添加文件头的地方打出“aa”&#xff0c;回车&#xff0c;会自…

输入系统应用编程

1. 什么是输入系统 ⚫先来了解什么是输入设备&#xff1f; 常见的输入设备有键盘、鼠标、遥控杆、书写板、触摸屏等等, 用户通过这些输入设备与 Linux 系统进行数据交换。 ⚫ 什么是输入系统&#xff1f; 输入设备种类繁多&#xff0c;能否统一它们的接口&#xff1f;既在…

基于跳蛛算法的无人机航迹规划-附代码

基于跳蛛算法的无人机航迹规划 文章目录 基于跳蛛算法的无人机航迹规划1.跳蛛搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用跳蛛算法来优化无人机航迹规划。 1.跳蛛搜索算法 …

Prometheus+Node_exporter+Grafana实现监控主机

PrometheusNode_exporterGrafana实现监控主机 如果没有安装相关的配置&#xff0c;首先要进行安装配置&#xff0c;环境是基于Linux&#xff0c;虚拟机的相关环境配置在文末给出&#xff0c;现在先讲解PrometheusNode_exporterGrafana的安装和使用。 一.Prometheus安装 虽然…

基于SSM的鲜花商城系统

基于SSM的鲜花商城系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 鲜花列表 热销商品 商品详情 登录界面 购物车 管理员界面 摘要 基于SSM的鲜花商…

【差旅游记】公乌素遇到的那些司机师傅

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 出差人出差在外&#xff0c;城际间靠各种公共交通工具&#xff0c;但到了目的地的城镇&#xff0c;最后一公里往往少不了打车&#xff0c;或出租车&#xff0c;或摩的三轮车。 不同于公共交通&#xff0c;像飞机火车高…

找不到d3dx9_43.dll如何修复?d3dx9_43.dll丢失的解决办法分享

在电脑使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到d3dx9_43.dll”。这个错误通常出现在运行某些游戏或应用程序时&#xff0c;它会导致程序无法正常运行。那么&#xff0c;如何解决找不到d3dx9_43.dll的问题呢&#xff1f;下面我将分享…

腾讯云CVM S5服务器4核8G配置性能测评和优惠价格表

腾讯云4核8G服务器CVM标准型S5实例性能测评&#xff0c;包括CPU型号、内存、系统盘、CVM实例规格性能测评&#xff0c;腾讯云4核8G租用优惠价格表&#xff0c;腾讯云服务器网txyfwq.com分享腾讯云4核8G服务器CVM S5性能测评和优惠价格表&#xff1a; 腾讯云4核8G服务器CVM S5性…

第五部分:Tomcat

目录 补充&#xff1a;XML 一&#xff1a;XML简介 1.1&#xff1a;什么是XML&#xff1f; 1.2&#xff1a;XML的作用 1.3&#xff1a;XML语法 1.3.1&#xff1a;文档声明 1.3.2&#xff1a;元素&#xff08;标签&#xff09; 1.3.3&#xff1a;XML属性 1.3.4&#xff1a;XML注…

大数据毕业设计选题推荐-智慧小区大数据平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

17. 机器学习 - 随机森林

Hi&#xff0c;你好。我是茶桁。 我们之前那一节课讲了决策树&#xff0c;说了决策树的优点&#xff0c;也说了其缺点。 决策树实现起来比较简单&#xff0c;解释解释性也比较强。但是它唯一的问题就是不能拟合比较复杂的关系。 后来人们为了解决这个问题&#xff0c;让其能…

操作系统·操作系统引论

1.1 操作系统的目标和作用 1.目前常见操作系统&#xff1a; 微软&#xff1a;Windows系列&#xff08;以前MS-DOS&#xff09; UNIX&#xff1a;Solaris, AIX, HP UX, SVR4, BSD, ULTRIX 自由软件&#xff1a;Linux, freeBSD, Minix IBM: AIX, zOS(OS/390), OS/2, OS/400, PC…