GVKun编程网logo

Python OpenCV实现3种滤镜效果实例(python滤镜算法)

4

针对PythonOpenCV实现3种滤镜效果实例和python滤镜算法这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展/System/Library/Frameworks/Python.fr

针对Python OpenCV实现3种滤镜效果实例python滤镜算法这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python:无法打开文件“esptool.py”、CMake 不断从 cygwin python 中获取 Python,如何从 Windows 安装的 Python 中获取、Core Python | 2 - Core Python: Getting Started | 2.5 - Modularity | 2.5.5 - The Python Execution Mod、Error: Can‘t find Python executable “python“, you can set the PYTHON env variable等相关知识,希望可以帮助到你。

本文目录一览:

Python OpenCV实现3种滤镜效果实例(python滤镜算法)

Python OpenCV实现3种滤镜效果实例(python滤镜算法)

前言

本篇文章要使用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滤镜效果内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

您可能感兴趣的文章:
  • Python OpenCV超详细讲解调整大小与图像操作的实现
  • Python OpenCV超详细讲解读取图像视频和网络摄像头
  • Python中使用Opencv开发停车位计数器功能
  • 关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
  • Python OpenCV实现图形检测示例详解
  • python OpenCV 图像通道数判断
  • 巧妙使用python opencv库玩转视频帧率
  • python+opencv实现堆叠图片
  • python 使用OpenCV进行曝光融合

/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python:无法打开文件“esptool.py”

/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python:无法打开文件“esptool.py”

如何解决/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python:无法打开文件“esptool.py”

我正在 mac OS X 上使用 ESP8266Flash.app 更新 ESP8266 固件。 但是当我开始刷固件时出现以下错误:

/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python: can''t open file ''esptool.py'': [Errno 1] Operation not permitted."

我该如何解决这个问题?

CMake 不断从 cygwin python 中获取 Python,如何从 Windows 安装的 Python 中获取

CMake 不断从 cygwin python 中获取 Python,如何从 Windows 安装的 Python 中获取

如何解决CMake 不断从 cygwin python 中获取 Python,如何从 Windows 安装的 Python 中获取

我有一个看起来像这样的 CMake 脚本:

  1. find_program(PYTHON_COMMAND NAMES python3 python)

问题是它检测到安装在 Cygwin 安装中的 python。 输出总是:

  1. -- PYTHON_PATH:C:/cygwin64/bin/python3

我希望它取自:

  1. c:\\python36-64\\python

在windows PATH变量中,Cygwin bin在路径的最后一个,windows安装在第一个 但它只检测到 Cygwin python,
怎么改?

Core Python | 2 - Core Python: Getting Started | 2.5 - Modularity | 2.5.5 - The Python Execution Mod

Core Python | 2 - Core Python: Getting Started | 2.5 - Modularity | 2.5.5 - The Python Execution Mod

It's important to understand the Python execution model and precisely when function deFinitions and other important events occur when a module is imported or executed. Here, we show execution of our Python module as it's imported in a graphical debugging environment. We step through the top‑level statements in the module. What's important to realize here is that the def used for the fetch_words function isn't merely a declaration. It's actually a statement, which when executed in sequence with the other top‑level model scope code, causes the code within the function to be bound to the name of the function. When modules are imported or run, all of the top‑level statements are run, and this is the means by which the function within the module namespace are defined. We are sometimes asked about the difference between Python modules, Python scripts, and Python programs. Any .py file constitutes a Python module. But as we've seen, modules can be written for convenient import, convenient execution, or using the if dunder name = dunder main idiom, both. We strongly recommend making even simple scripts importable since it eases development and testing so much if you can access your code from within the REPL. Likewise, even modules, which are only ever meant to be imported in production settings, benefit from having executable test code. For this reason, nearly all modules we create have this form of defining one or more importable functions with a postscript to facilitate execution. Whether you consider a module to be a Python script or Python program is a matter of context and usage. It's certainly wrong to consider Python to be merely a scripting tool, in the vein of Windows batch files or UNIX Shell scripts, as many large and complex applications are built exclusively with python.

 

  • def不仅仅是一个declaration声明,更是一条statement语句。它将其中的python代码于函数名绑定在一起
  • 一个py文件就是一个模块,这个模块包含类或函数。你写python,要尽量将代码包装成函数和类,方便各种import
  • 一个py文件也可看作是一个脚本,在系统命令行中运行
  • python不仅仅是脚本语言,很多大型程序都是用python构建的

Error: Can‘t find Python executable “python“, you can set the PYTHON env variable

Error: Can‘t find Python executable “python“, you can set the PYTHON env variable

在启动vue项目的时候,安装node.js组件node-sass过程中报错了,错误提示如下
Error: Can’t find Python executable “python”, you can set the PYTHON env variable

由错误提示可知:Node.js 在安装模块组件node-sass的时候,node.js缺少Visual Studio2015 Build Tools相关的组件和python的环境,如果安装了vs2015组件的小伙伴们就不用安装Visual Studio2015 Build Tools相应的组件,只用安装python2.7即可解决缺少的python组件的问题。

欲安装python2.7,请至python官网:www.python.org 下载,然后配置好python的环境变量即可。

不过博主我并不推荐上述的解决方案,因为对于程序员来说,效率第一,上述的问题一个命令就可以轻松解决你所遇到的麻烦,前面说了那么多,无非就是想告诉在看本篇博客的同仁们放下浮躁的心,遇到问题首先不是急着去解决问题,而是分析为什么会这样,然后才能水到聚成的去找到解决问题的方法。

运行下面这个命令即可解决你们遇到的Error问题

npm install --global --production windows-build-tools

:上面讲述了一堆就是为了讲述此命令是干嘛的,上面已经描述很详细了,就不再赘述了,该操作与上述的一堆操作无异,效果却是一样的。

然后运气不好的小伙伴可能接着会遇到一个坑,那就是执行了:npm install --global --production windows-build-tools这个命令的人细心点会发现执行到一半就卡住了,这个卡住了没有红字重点提示,而且下方还有英文在等待中,粗心的小伙伴可能以为是命令执行完了,组件安装好了,其实不然,我这边已经解决了,就无法复现了,具体点就是中文的提示,提示我们由于有类似组件在运行或者下载导致无法继续下载安装组件了。稳妥点的解决办法是,将电脑重启,将底层正在运行的模块干掉,待电脑重启后再执行npm install --global --production windows-build-tools这条命令即可,博主我就是这样解决的,稳稳的幸福就会浮现在你面前如下图所示,你的可能和我不一样,因为我已经跑成功过一次了,没有你的那么多细节的log打印。
在这里插入图片描述

然后就是在你的项目下shift+鼠标右击你的项目运行npm run dev即可启动vue项目了。

今天关于Python OpenCV实现3种滤镜效果实例python滤镜算法的介绍到此结束,谢谢您的阅读,有关/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python:无法打开文件“esptool.py”、CMake 不断从 cygwin python 中获取 Python,如何从 Windows 安装的 Python 中获取、Core Python | 2 - Core Python: Getting Started | 2.5 - Modularity | 2.5.5 - The Python Execution Mod、Error: Can‘t find Python executable “python“, you can set the PYTHON env variable等更多相关知识的信息可以在本站进行查询。

本文标签: