Python OpenCV实现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滤镜效果内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python Opencv实现最强美颜滤镜效果

    目录 前言 环境安装 效果展示 第一组随机 第二组随机 源码展示 额外的小知识补充: 加载图片: 图片模糊处理: 总结 前言 继老干妈.辣条之后,中国美颜软件在海外一夜成名,把所有人都幻化成了粉红小甜心. 人类学者克里斯特尔·阿比丁博士认为,这是一种亚洲风情的文化扩散. 哈喽!哈喽,我是木子! “亚洲四大邪术”之一的中国美颜术绝非浪得虚名—— 根据小编的第八定律,99% 的人拍了照在发朋友圈之前,都会给自己P一P. 并且都信奉着一个真理:美颜过后的自己,才是真正的自己.​ 最初,大家修改的范围也

  • OpenCV-Python实现怀旧滤镜与连环画滤镜

    怀旧滤镜实现原理 不管是荣耀华为手机还是其他的手机,我们都可以找到相机中的怀旧效果,这是手机中常用的一种滤镜效果. 怀旧风格的设计主要是在图像的颜色空间进行处理.以BGR为例,对B.G.R这3个通道的颜色数值进行处理,让图像有一种泛黄的怀旧效果.设计的转换公式如下: B=0.272r+0.534g+0.131*b G=0.349r+0.686g+0.168*b R=0.393r+0.769g+0.189*b 计算公式中的小写的bgr是原图像的RGB通道的颜色,结果BGR是怀旧变换后的值.需要注意

  • Python OpenCV处理图像之滤镜和图像运算

    本文实例为大家分享了Python OpenCV处理图像之滤镜和图像运算的具体代码,供大家参考,具体内容如下 0x01. 滤镜 喜欢自拍的人肯定都知道滤镜了,下面代码尝试使用一些简单的滤镜,包括图片的平滑处理.灰度化.二值化等: import cv2.cv as cv image=cv.LoadImage('img/lena.jpg', cv.CV_LOAD_IMAGE_COLOR) #Load the image cv.ShowImage("Original", image) grey

  • python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)

    图像素描特效 图像素描特效主要经过以下几个步骤: 调用cv.cvtColor()函数将彩色图像灰度化处理: 通过cv.GaussianBlur()函数实现高斯滤波降噪: 边缘检测采用Canny算子实现: 最后通过cv.threshold()反二进制阈值化处理实现素描特效. #coding:utf-8 import cv2 as cv import numpy as np #读取原始图像 img = cv.imread('d:/paojie.png') #图像灰度处理 gray = cv.cvtC

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

    目录 前言 浮雕滤镜效果 雕刻滤镜效果 凸透镜滤镜效果 总结 前言 本篇文章要使用OpenCV.Numpy 和Math这3个工具包实现一个简单的滤镜编辑器.在这个滤镜编辑器中,包含了3种滤镜效果,它们分别是浮雕滤镜.雕刻滤镜和凸透镜滤镜.本篇文章将对目标图像(如图1所示)进行处理,使得目标图像分别呈现浮雕滤镜(如图2所示).雕刻滤镜(如图3所示)和凸透镜滤镜(如图4所示)的视觉效果. 浮雕滤镜效果 为了实现浮雕滤镜效果,首先要把实现浮雕滤镜效果的原理搞清楚.弄明白.实现浮雕滤镜效果的原理如下所示

  • python opencv检测目标颜色的实例讲解

    实例如下所示: # -*- coding:utf-8 -*- __author__ = 'kingking' __version__ = '1.0' __date__ = '14/07/2017' import cv2 import numpy as np import time if __name__ == '__main__': Img = cv2.imread('example.png')#读入一幅图像 kernel_2 = np.ones((2,2),np.uint8)#2x2的卷积核

  • python opencv读mp4视频的实例

    如下所示: #获得视频的格式 videoCapture = cv2.VideoCapture('/home/lw/3661.mp4') #获得码率及尺寸 fps = videoCapture.get(cv2.CAP_PROP_FPS) size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)), int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT))) fNUMS = videoCapture.get(

  • 深入学习Python+Opencv常用四种图像处理操作

    目录 改变色彩空间: cv.cvtColor() 改变图像大小:cv.resize() 二维卷积操作 常用模糊 opencv图像处理(深度学习中常用的) 改变色彩空间: cv.cvtColor() cv.cvtColor(img, flag) img:原图像 flag:要改变的类型 常用的flag有:cv.COLOR_BGR2GRAY (BGR->GRAY).cv.COLOR_BGR2HSV img = cv.imread(r'E:\0_postgraduate\test.jpg') gray

  • python+opencv实现车牌定位功能(实例代码)

    写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验三,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验三. 由于时间紧张,代码没有进行任何优化,实验算法仅供参考. 实验要求 对给定的车牌进行车牌识别 实验代码 代码首先贴在这里,仅供参考 源代码 实验代码如下: import cv2 import numpy as np def lpr(filename): img = cv2.imread(filename) # 预处理,包括灰度处理,高斯

  • 利用For循环遍历Python字典的三种方法实例

    目录 前言 方法 1:使用 For 循环 + 索引进行迭代 方法 2:使用 .keys( ) + 索引进行迭代 方法 3:使用 .items( ) 进行迭代 进阶:遍历嵌套字典 总结 前言 在Python中,如何使用“for”循环遍历字典? 今天我们将会演示三种方法,并学会遍历嵌套字典. 在实战前,我们需要先创建一个模拟数据的字典. dict_1 = {'Name': 'Zara', 'Age': 7, 'Class': 'First','Address':'Beijing'} 方法 1:使用

  • Python Opencv轮廓常用操作代码实例解析

    1.颜色空间转换 使用cv2.cvtColor(input_image ,flag),flag为转换类型 常用的转换类型有: BGR和灰度图的转换使用 cv2.COLOR_BGR2GRAY BGR和HSV的转换使用 cv2.COLOR_BGR2HSV img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 2.二值化 ret, dst = cv2.threshold(src, thresh, maxval, type) src:表示的是图片源(灰度图)

  • Python+OpenCV+pyQt5录制双目摄像头视频的实例

    起因 说起来录制视频,我们可能有很多的软件,但是比较坑的是,好像很少的软件支持能够同时录制两个摄像头的视频,于是我们用python自己写一个.要是OpenCV+python.貌似很简单就能OK的事情,但是,我们的项目不是一般要展示给老师看嘛.谁愿意看一个没有界面的录制过程是吧~,最后会附上源代码~ 依赖的包 在这里,我直接把import的包写出来了各位可以进行对号入座,然后就能知道需要安装哪个包啦! import cv2 import numpy as np from PyQt5.QtWidge

  • 关于初始种子自动选取的区域生长实例(python+opencv)

    算法中,初始种子可自动选择(通过不同的划分可以得到不同的种子,可按照自己需要改进算法),图分别为原图(自己画了两笔为了分割成不同区域).灰度图直方图.初始种子图.区域生长结果图. 另外,不管时初始种子选择还是区域生长,阈值选择很重要. import cv2 import numpy as np import matplotlib.pyplot as plt #初始种子选择 def originalSeed(gray, th): ret, thresh = cv2.cv2.threshold(gr

  • python opencv画局部放大图实例教程

    目录 为什么要画局部放大图? 程序逻辑 程序实例 总结 这项功能的目的是为了方便使用opencv做图像标注工具. 为什么要画局部放大图? 在做图像数据标注时,很难一次就做到精准标注,经常需要微调才能达到比较好的标注效果.如果目标比较小,即使微调也难以做到精准,所以就需要另外一个窗口对标注区域进行局部放大以方便微调. 程序逻辑 本文中标注信息以矩形框作为示例,矩形框是图像标注中最常用到的一种标注信息形态.其他标注信息的设计逻辑雷同. 程序主要逻辑是:鼠标在任意窗口中做的操作都要同步映射到另外一个窗

随机推荐