>  기사  >  백엔드 개발  >  Python 컨볼루션 함수를 사용하는 방법

Python 컨볼루션 함수를 사용하는 방법

WBOY
WBOY앞으로
2023-05-20 21:31:111675검색

컨볼루션 함수

python는 다양한 컨볼루션 방식을 제공합니다. 이에 비해 ndimage에 정의된 컨볼루션 함수는 numpy의 컨볼루션보다 더 기능적입니다. > 및 signal은 약간 더 복잡합니다. 이것은 입력 매개변수의 수만 봐도 알 수 있습니다python提供了多种卷积方案,相比之下,定义在ndimage中的卷积函数,在功能上比numpysignal中的卷积要稍微复杂一些,这点仅从输入参数的多少就可略窥一二

numpy.convolve(a, v, mode='full')
scipy.ndimage.convolve1d(input, weights, axis=-1, output=None, mode='reflect', cval=0.0, origin=0)

scipy.signal.convolve(in1, in2, mode='full', method='auto')
scipy.ndimage.convolve(input, weights, output=None, mode='reflect', cval=0.0, origin=0)

前两者为1维卷积函数,且ndimage可对多维数组沿着单个坐标轴进行卷积操作,后两者为多维卷积。

numpy和signal中的卷积函数,其mode都有三种,用以调节卷积后的边缘特性,如果输入的两个卷积对象的维度分别是N NN和M MM,则这三种模式的输出结果为

  • full: 输出维度N + M − 1 N+M-1N+M−1,其最后一点的信号完全不交叠,故而边缘效应明显。

  • same:输出维度max ⁡ ( M , N ) max(M,N)max(M,N),边缘效应仍然可见

  • valid:输出维度∣ M − N ∣ |M-N|∣M−N∣,只返回完全交叠的区域,相当于把存在边缘效应的点都率除掉了

 ndimage中的convolve针对边缘效应,对图像进行扩展,而其mode决定的就是扩展之后的填充格式,设待滤波数组为a b c d,则在不同的模式下,对边缘进行如下填充


左侧填充 数据 右侧填充
reflect d c b a a b c d d c b a
constant k k k k a b c d k k k k
nearest a a a a a b c d d d d d
mirror d c b a b c d c b a
wrap a b c d a b c d a b c d

其中,k通过参数cval设定。

这五种修改边界的方法,在scipy.ndimage的函数中十分普遍,尤其是涉及到卷积的滤波函数,堪称标配。

对比测试

接下来针对这些不同的卷积函数,做一下性能测试,用5 × 5的卷积模板,对1000 × 1000的矩阵进行卷积计算,来看一下不同实现方案的卷积,其速度如何

import numpy as np
import scipy.signal as ss
import scipy.ndimage as sn
from timeit import timeit


A = np.random.rand(1000,1000)
B = np.random.rand(5,5)

timeit(lambda : ss.convolve(A, B), number=10)
# 0.418
timeit(lambda : sn.convolve(A, B), number=10)
# 0.126

相比之下,ndimage中的卷积显然是更高效的。

接下来测试一下一维卷积的表现

A = np.random.rand(10000)
B = np.random.rand(15)

timeit(lambda : np.convolve(A, B), number=1000)
# 0.15256029999727616
timeit(lambda : ss.convolve(A, B), number=1000)
# 0.1231262000001152
timeit(lambda : sn.convolve(A, B), number=1000)
# 0.09218210000108229
timeit(lambda : sn.convolve1d(A, B), number=1000)
# 0.03915820000111125

相比之下,convolve1d不愧是写明了1d的卷积函数,速度最快,而numpy

from scipy.misc import ascent
import matplotlib.pyplot as plt
img = ascent()
temp = np.zeros([3,3])
temp[:,0] = -1
temp[:,2] = 1

edge = sn.convolve(img, temp)

fig = plt.figure()
ax = fig.add_subplot(121)
ax.imshow(img)
ax = fig.add_subplot(122)
ax.imshow(edge)
plt.show()

처음 두 개는 1차원 컨볼루션 함수이고 ndimage는 다차원 배열에 대해 컨볼루션 작업을 수행할 수 있습니다. 단일 좌표축을 따라, 후자의 두 개는 다차원 컨볼루션입니다.

numpy와 signal의 컨볼루션 함수에는 컨볼루션 후 가장자리 특성을 조정하는 데 사용되는 세 가지 모드가 있습니다. 두 입력 컨볼루션 개체의 차원이 각각 N NN 및 M MM이면 이 세 가지 모드의 출력 결과는

  • full: 출력 차원 N + M − 1 N+M-1N+M−1 및 최종 신호 점이 전혀 겹치지 않으므로 가장자리 효과가 분명합니다.

  • Python 컨볼루션 함수를 사용하는 방법동일: 출력 크기 max ⁡ ( M , N ) max(M,N)max(M,N), 가장자리 효과는 여전히 표시됩니다
  • 유효: 출력 차원 ∣ M − N ∣ |M-N|∣M−N∣, 완전히 겹치는 영역만 반환합니다. 이는 가장자리 효과가 있는 모든 점을 제거하는 것과 같습니다. li>

ndimageconvolve는 가장자리 효과를 위해 이미지를 확장하고 해당 mode는 확장된 채우기 형식을 결정합니다. 필터링할 배열은 a b c d이고, 다른 모드에서는 가장자리가 다음과 같이 채워집니다🎜a b c d td>

왼쪽 패딩 데이터 오른쪽 패딩
반영 d c b a a b c d d c b a
상수 code> k k k k a b c d k k k k
가장 가까운 td> a a a a a a b c d d d d d
미러 d c b a b c d c b a
wrapa b c d a b c d
🎜그 중 kcval 설정. 🎜🎜경계를 수정하는 이 다섯 가지 방법은 <code>scipy.ndimage의 함수, 특히 표준인 컨볼루션과 관련된 필터 함수에서 매우 일반적입니다. 🎜🎜비교 테스트🎜🎜 다음으로, 5×5 컨볼루션 템플릿을 사용하여 1000×1000 행렬에서 컨볼루션 계산을 수행하여 다양한 구현 솔루션이 얼마나 빠른지 확인하세요. 🎜rrreee🎜 이에 비해 ndimage의 컨볼루션이 확실히 더 효율적입니다. 🎜🎜다음으로 1차원 컨볼루션의 성능을 테스트해보겠습니다🎜rrreee🎜반면 convolve1d는 실제로 1d의 컨볼루션 함수가 제공하는 기능 중 가장 빠릅니다. numpy에서는 가장 느립니다. 🎜🎜컨볼루션 응용🎜🎜컨볼루션 작업은 이미지 필터링 및 가장자리 추출에 자주 사용됩니다. 예를 들어 아래와 유사한 행렬을 통해 이미지의 수직 가장자리를 추출할 수 있습니다. 🎜🎜🎜🎜🎜간단한 테스트를 해보자🎜rrreee

위 내용은 Python 컨볼루션 함수를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제