返回顶部
首页 > 资讯 > 后端开发 > Python >Python OpenCV实现3种滤镜效果实例
  • 533
分享到

Python OpenCV实现3种滤镜效果实例

2024-04-02 19:04:59 533人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录前言浮雕滤镜效果雕刻滤镜效果凸透镜滤镜效果总结前言 本篇文章要使用OpenCV、Numpy 和Math这3个工具包实现一个简单的滤镜编辑器。在这个滤镜编辑器中,包含了3种滤镜效果

前言

本篇文章要使用OpenCV、Numpy 和Math这3个工具包实现一个简单的滤镜编辑器。在这个滤镜编辑器中,包含了3种滤镜效果,它们分别是浮雕滤镜、雕刻滤镜和凸透镜滤镜。本篇文章将对目标图像(如图1所示)进行处理,使得目标图像分别呈现浮雕滤镜(如图2所示)、雕刻滤镜(如图3所示)和凸透镜滤镜(如图4所示)的视觉效果。

浮雕滤镜效果

为了实现浮雕滤镜效果,首先要把实现浮雕滤镜效果的原理搞清楚、弄明白。实现浮雕滤镜效果的原理如下所示:

  • 根据灰度图像中的某一个像素的像素值与其周围像素的像素值之间的差值,确定这个像素经过卷积处理后的像素值;

  • 由于边缘点的像素值与其周围像素的像素值之间的差值较大,经卷积处理后,导致这些边缘点较亮,从而达到凸显边缘的目的,进而形成浮雕状;

  • 为经卷积处理后的每一个像素加上一个灰度偏移值128,作为呈现浮雕滤镜效果的图像的底色。

明确了实现浮雕滤镜效果的原理后,再来学习一下实现浮雕滤镜效果的算法。实现浮雕滤镜效果的算法如下所示:

  • 对灰度图像中的每一个像素进行卷积处理;

  • 实现浮雕滤镜效果的卷积核算子需采用如下矩阵:

[[1, 0], [0, -1]]

掌握了实现浮雕滤镜效果的原理和算法后,下面开始编写用于实现浮雕滤镜效果的方法,即fuDiao()方法。fuDiao()方法是一个自定义的、有参且有返回值的方法,fuDiao()方法的语法格式如下所示:

def fuDiao(img):
    ……# 省略方法体中的代码
    return canvas

参数说明:

 img:与目标图像对应的灰度图像。

返回值说明:

canvas:画布,用于呈现浮雕滤镜效果的图像。

那么,fuDiao()方法被省略的代码各自发挥怎样的作用?此外,被省略的代码又是那些呢?

先要明确fuDiao()方法中被省略的代码各自发挥的作用是什么:

因为用于实现浮雕滤镜效果的卷积核算子是一个二维矩阵,所以需要使用Numpy工具包中的array()方法创建这个二维矩阵。关键代码如下所示:

kernel = np.array([[1, 0], [0, -1]])

分别获取灰度图像中像素的行数和列数。关键代码如下所示:

row = img.shape[0]
col = img.shape[1]

根据灰度图像中像素的行数和列数,创建一个等高、等宽的,纯黑色的画布。关键代码如下所示:

canvas = np.zeros([row, col], dtype=np.uint8)

根据横、纵坐标,使用嵌套的for循环得到灰度图像中的每一个像素。关键代码如下所示:

for i in range(row - 1):
for j in range(col - 1):

使用实现浮雕滤镜效果的卷积核算子,对灰度图像中的每一个像素进行卷积处理,并且为经卷积处理后的每一个像素加上一个灰度偏移值128。关键代码如下所示:

new_value = np.sum(img[i:i + 2, j:j + 2] * kernel) + 128

对于经卷积处理且加上一个灰度偏移值后的每一个像素的像素值,如果大于255,那么等于255;如果小于0,那么等于0。关键代码如下所示:

if new_value > 255:
   new_value = 255
   elif new_value < 0:
      new_value = 0
  else:
    pass

把经过比较后的每一个像素的像素值根据坐标赋值给画布对应位置上的像素。关键代码如下所示:

canvas[i, j] = new_value

结合fuDiao()方法中被省略的代码和它们各自发挥的作用,就能够迅速完成fuDiao()方法的编写。fuDiao()方法的代码如下所示:

def fuDiao(img):
      kernel = np.array([[1, 0], [0, -1]])
      row = img.shape[0]
      col = img.shape[1]
      canvas = np.zeros([row, col], dtype=np.uint8)
      for i in range(row - 1):
         for j in range(col - 1):
             new_value = np.sum(img[i:i + 2, j:j + 2] * kernel) + 128
             if new_value > 255:
                 new_value = 255
              elif new_value < 0:
                 new_value = 0
              else:
                  pass
             canvas[i, j] = new_value
      return canvas

雕刻滤镜效果

实现雕刻滤镜效果的原理与实现浮雕滤镜效果的原理大致相同,实现雕刻滤镜效果的原理如下所示:

  • 根据灰度图像中的某一个像素的像素值与其周围像素的像素值之间的差值,确定这个像素经过卷积处理后的像素值;

  • 由于边缘点的像素值与其周围像素的像素值之间的差值较大,经卷积处理后,导致这些边缘点较暗,从而达到凹陷边缘的目的,进而形成雕刻状;

  • 为经卷积处理后的每一个像素加上一个灰度偏移值128,作为呈现雕刻滤镜效果的图像的底色。

虽然实现雕刻滤镜效果的原理与实现浮雕滤镜效果的原理大致相同,但是实现雕刻滤镜效果的算法与实现浮雕滤镜效果的算法大不相同。实现雕刻滤镜效果的算法如下所示:

  • 对灰度图像中的每一个像素进行卷积处理;

  • 实现雕刻滤镜效果的卷积核算子需采用如下矩阵:

[[-1, 0],
[0, 1]]

掌握了实现雕刻滤镜效果的原理和算法后,下面开始编写用于实现雕刻滤镜效果的方法,即diaoKe()方法。与fuDiao()方法相同,diaoKe()方法也是一个自定义的、有参且有返回值的方法,diaoKe()方法的语法格式如下所示:

def diaoKe(img):
   ……# 省略方法体中的代码
    return canvas

参数说明:

img:与目标图像对应的灰度图像。

返回值说明:

canvas:画布,用于呈现雕刻滤镜效果的图像。

diaoKe()方法被省略的代码与fuDiao()方法被省略的代码大同小异,首先明确下diaoKe()方法中被省略的代码各自发挥的作用是什么:

用于实现雕刻滤镜效果的卷积核算子与用于实现浮雕滤镜效果的卷积核算子虽然不同,但也是一个二维矩阵,因此需要使用Numpy工具包中的array()方法创建这个二维矩阵。关键代码如下所示:

kernel = np.array([[-1, 0], [0, 1]])

分别获取灰度图像中像素的行数和列数。关键代码如下所示:

row = img.shape[0]
col = img.shape[1]

根据灰度图像中像素的行数和列数,创建一个等高、等宽的,纯黑色的画布。关键代码如下所示:

canvas = np.zeros([row, col], dtype=np.uint8)

根据横、纵坐标,使用嵌套的for循环得到灰度图像中的每一个像素。关键代码如下所示:

for i in range(row - 1):
for j in range(col - 1):

使用实现雕刻滤镜效果的卷积核算子,对灰度图像中的每一个像素进行卷积处理,并且为经卷积处理后的每一个像素加上一个灰度偏移值128。关键代码如下所示:

new_value = np.sum(img[i:i + 2, j:j + 2] * kernel) + 128

对于经卷积处理且加上一个灰度偏移值后的每一个像素的像素值,如果大于255,那么等于255;如果小于0,那么等于0。关键代码如下所示:

  if new_value > 255:
      new_value = 255
  elif new_value < 0:
      new_value = 0
  else:
      pass

把经过比较后的每一个像素的像素值根据坐标赋值给画布对应位置上的像素。关键代码如下所示:

canvas[i, j] = new_value

结合diaoKe()方法中被省略的代码和它们各自发挥的作用,就能够迅速完成diaoKe()方法的编写。diaoKe()方法的代码如下所示:

  def diaoKe(img):
      kernel = np.array([[-1, 0], [0, 1]])
      row = img.shape[0]
      col = img.shape[1]
      canvas = np.zeros([row, col], dtype=np.uint8)
      for i in range(row - 1):
          for j in range(col - 1):
              new_value = np.sum(img[i:i + 2, j:j + 2] * kernel) + 128
              if new_value > 255:
                  new_value = 255
              elif new_value < 0:
                  new_value = 0
              else:
                  pass
              canvas[i, j] = new_value
      return canvas

凸透镜滤镜效果

所谓凸透镜滤镜效果,相当于用户使用凸透镜观察一幅图像而成的视觉效果。实现凸透镜滤镜效果的原理与实现浮雕滤镜效果的原理和实现雕刻滤镜效果的原理大不相同。下面将着重对实现凸透镜滤镜效果的原理进行讲解:

  • 当使用凸透镜中心观察一幅图像时,被观察的图像区域将按照一定比例进行放大;相应地,这个区域的周围区域将被压缩;

  • 为了让放大后的图像区域看起来和谐自然,这些被压缩的周围区域要保持连续性。

明确了实现凸透镜滤镜效果的原理后,再来学习一下实现凸透镜滤镜效果的算法。实现凸透镜滤镜效果的算法如下所示:

  • 根据目标图像的宽、高确定凸透镜的半径;

  • 选择一个凸函数作为映射函数;

如果目标图像中的某一个像素与目标图像中心之间的距离的平方不大于凸透镜的半径的平方(两个整数进行比较,保证比较结果的精确度),就使用映射函数对这个像素的横、纵坐标进行映射处理。

掌握了实现凸透镜滤镜效果的原理和算法后,下面开始编写用于实现凸透镜滤镜效果的方法,即tuTouJing()方法。与fuDiao()方法和diaoKe()方法相同,tuTouJing()方法也是一个自定义的、有参且有返回值的方法,tuTouJing()方法的语法格式如下所示:

def tuTouJing(img):
    ……# 省略方法体中的代码
    return canvas

参数说明:

 img:目标图像。

返回值说明:

canvas:画布,用于呈现凸透镜滤镜效果的图像。

先要明确tuTouJing()方法中被省略的代码各自发挥的作用是什么:

分别获取目标图像中像素的行数和列数以及目标图像的通道数。关键代码如下所示:

row = img.shape[0]
col = img.shape[1]
channel = img.shape[2]

根据目标图像中像素的行数和列数以及目标图像的通道数,创建一个等高、等宽、等通道数的,纯黑色的画布。关键代码如下所示:

canvas = np.zeros([row, col, channel], dtype=np.uint8)

根据目标图像中像素的行数和列数,分别获取目标图像中心的横、纵坐标。关键代码如下所示:

center_x = row/2
center_y = col/2

比较目标图像中心的横、纵坐标的大小,把较小的数值作为凸透镜的半径。关键代码如下所示:

radius = min(center_x, center_y)

根据横、纵坐标,使用嵌套的for循环得到目标图像中的每一个像素。关键代码如下所示:

for i in range(row):
for j in range(col):

计算目标图像中的每一个像素与目标图像中心之间的距离的平方和距离。关键代码如下所示:

distance = ((i-center_x) * (i-center_x) + (j-center_y) * (j-center_y))
new_dist = math.sqrt(distance)

把目标图像中的每一个像素的像素值根据坐标赋值给画布对应位置上的像素。关键代码如下所示:

canvas[i,j,:] = img[i, j, :]

如果目标图像中的某一个像素与目标图像中心之间的距离的平方不大于凸透镜的半径的平方,就使用映射函数对这个像素的横、纵坐标进行映射处理。关键代码如下所示:

if distance <= radius**2:
new_i = np.int(np.floor(new_dist * (i-center_x) / radius + center_x))
new_j = np.int(np.floor(new_dist * (j-center_y) / radius + center_y))

把经过映射处理后的每一个像素的像素值根据坐标赋值给画布对应位置上的像素。关键代码如下所示:

canvas[i,j,:] = img[new_i, new_j, :]

结合tuTouJing()方法中被省略的代码和它们各自发挥的作用,就能够迅速完成tuTouJing()方法的编写。tuTouJing()方法的代码如下所示:

  def tuTouJing(img):
      row = img.shape[0]
      col = img.shape[1]
      channel = img.shape[2]
      canvas = np.zeros([row, col, channel], dtype=np.uint8)
      center_x = row/2
      center_y = col/2
      radius = min(center_x, center_y)
      for i in range(row):
          for j in range(col):
              distance = ((i-center_x) * (i-center_x) + (j-center_y) * (j-center_y))
              new_dist = math.sqrt(distance)
              canvas[i,j,:] = img[i, j, :]
              if distance <= radius**2:
                  new_i = np.int(np.floor(new_dist * (i-center_x) / radius + center_x))
                  new_j = np.int(np.floor(new_dist * (j-center_y) / radius + center_y))
                  canvas[i,j,:] = img[new_i, new_j, :]
      return canvas

总结

到此这篇关于python OpenCV实现3种滤镜的文章就介绍到这了,更多相关Python OpenCV滤镜效果内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python OpenCV实现3种滤镜效果实例

本文链接: https://lsjlt.com/news/117193.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python OpenCV实现3种滤镜效果实例
    目录前言浮雕滤镜效果雕刻滤镜效果凸透镜滤镜效果总结前言 本篇文章要使用OpenCV、Numpy 和Math这3个工具包实现一个简单的滤镜编辑器。在这个滤镜编辑器中,包含了3种滤镜效果...
    99+
    2024-04-02
  • Android实现滤镜效果ColorMatrix
    本文实例为大家分享了Android实现滤镜效果的具体代码,供大家参考,具体内容如下 1.效果图 2.矩阵算法 package net.surina.myapplication1...
    99+
    2024-04-02
  • OpenCV-Python实现怀旧滤镜与连环画滤镜
    目录怀旧滤镜实现原理实现怀旧滤镜连环画滤镜原理实现连环画滤镜熔铸算法冰冻算法怀旧滤镜实现原理 不管是荣耀华为手机还是其他的手机,我们都可以找到相机中的怀旧效果,这是手机中常用的一种滤...
    99+
    2024-04-02
  • canvas如何实现滤镜效果
    这篇文章给大家分享的是有关canvas如何实现滤镜效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下<!DOCTYPE html>  ...
    99+
    2024-04-02
  • Flutter实现图片滤镜效果
    目录ColorFilter 介绍选取图片布局本着学习的态度,研究了一下flutter里面的ColorFilter,字面意思翻译颜色过滤器,学习就是要举一反三,拓展思考就把这个功能做了...
    99+
    2024-04-02
  • OpenCV-Python如何实现怀旧滤镜与连环画滤镜
    这篇文章给大家分享的是有关OpenCV-Python如何实现怀旧滤镜与连环画滤镜的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。怀旧滤镜实现原理不管是荣耀华为手机还是其他的手机,我们都可以找到相机中的怀旧效果,这是...
    99+
    2023-06-15
  • OpenCV-Python实现油画效果的实例
    目录油画的实现原理实现油画效果水彩效果油画的实现原理 油画简单的理解是带有艺术感的图像,色彩相对于原图要更加鲜艳,但却是失真的。 而且对于喜欢欣赏艺术的读者,肯定或多或少关注过油画,...
    99+
    2024-04-02
  • Android如何实现滤镜效果ColorMatrix
    这篇文章将为大家详细讲解有关Android如何实现滤镜效果ColorMatrix,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Android是什么Android是一种基于Linux内核的自由及开放源代码的...
    99+
    2023-06-14
  • Python学习之图片滤镜效果的实现
    目录前言Image模块对于图像处理的基本功能讲解对图像滤镜的应用1、显示图片轮廓2、显示图片浮雕效果3、显示图片轮廓4、显示图片模糊效果总结前言 滤镜效果是图像处理中常用的一种技术,...
    99+
    2023-05-19
    Python实现图片滤镜效果 Python图片滤镜 Python滤镜
  • PythonOpencv实现最强美颜滤镜效果
    目录前言环境安装效果展示第一组随机第二组随机源码展示额外的小知识补充:加载图片:图片模糊处理:总结前言 继老干妈、辣条之后,中国美颜软件在海外一夜成名,把所有人都幻化成了粉红小甜心。...
    99+
    2024-04-02
  • canvas中怎么实现图片滤镜效果
    canvas中怎么实现图片滤镜效果,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.获取图像数据 img.src = &rsquo...
    99+
    2024-04-02
  • 怎么用canvas实现图片滤镜效果
    小编给大家分享一下怎么用canvas实现图片滤镜效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 1.获取图像数据 img...
    99+
    2024-04-02
  • Canvas系列中滤镜效果的实现方法
    这篇文章给大家分享的是有关Canvas系列中滤镜效果的实现方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Canvas 真的是一个神奇的东西,不仅能够绘制各种图形、文本和位图,还能够对位图进行复杂的像素运算和处...
    99+
    2023-06-09
  • 如何使用CSS实现简单的滤镜效果
    这篇文章主要介绍“如何使用CSS实现简单的滤镜效果”,在日常操作中,相信很多人在如何使用CSS实现简单的滤镜效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用CSS实...
    99+
    2024-04-02
  • 实现微信小程序中的图片滤镜效果
    实现微信小程序中的图片滤镜效果随着社交媒体应用的流行,人们越来越喜欢在照片中应用滤镜效果,以增强照片的艺术效果和吸引力。在微信小程序中也可以实现图片滤镜效果,为用户提供更多有趣和创造性的照片编辑功能。本文将介绍如何在微信小程序中实现图片滤镜...
    99+
    2023-11-21
    图片 微信小程序 滤镜效果
  • Python+OpenCV实现六种常用图像特效
    目录图像融合灰度处理颜色反转灰度反转彩色反转马赛克效果毛玻璃效果浮雕效果图像融合 按照一定的比例将两张图片融合在一起 addWeighted()方法: 参数1第一张图片矩阵参数2第一...
    99+
    2024-04-02
  • 怎么用CSS滤镜实现颜色渐变翻转效果
    本篇内容介绍了“怎么用CSS滤镜实现颜色渐变翻转效果 ”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一下是...
    99+
    2024-04-02
  • 如何使用CSS滤镜实现圆角及波浪效果
    本篇内容主要讲解“如何使用CSS滤镜实现圆角及波浪效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用CSS滤镜实现圆角及波浪效果”吧!首先,我们来看这样...
    99+
    2024-04-02
  • python OpenCV 实现高斯滤波详解
    目录一、高斯滤波二、C++代码三、python代码四、结果展示1、原始图像2、5x5卷积3、9x9卷积一、高斯滤波    高斯滤波是一种线性平滑滤波,适用于消...
    99+
    2024-04-02
  • Python使用OpenCV实现虚拟缩放效果
    目录介绍要求目标构建结论介绍 OpenCV 彻底改变了整个图像处理领域。从图像分类到对象检测,我们不仅可以使用 OpenCV 库做一些很酷的事情,而且还可以构建一流的应用程序。 今天...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作