我知道original_image * filter = blur_image,*卷积在哪里。因此,filter = ifft(fft(blur)/fft(original))
我有一个原始图像、已知的滤镜和已知的模糊图像。我尝试了以下代码。我只想比较使用 fft 和 ifft 计算的滤波器,并将其与已知的滤波器进行比较。我在Matlab中尝试过:
orig = imread("orig.png")
blur = imread("blur.png")
fftorig = fft(orig)
fftblur = fft(blur)
div = fftblur/fftorig
conv = ifft(div)
Run Code Online (Sandbox Code Playgroud)
结果没有意义。我看到div包含很多NaN值,并且fftblur和fftorig都包含很多 0 值。我需要对此做些什么吗?比如使用fftshift?
编辑:为了使这一点更容易理解,我现在使用以下图像: http: //matlabgeeks.com/tips-tutorials/how-to-blur-an-image-with-a-fourier-transform-in- matlab-第一部分/
我决定使用以下链接计算origimage和的内核:blurimageunpad
kernelc = real(ifft2(fft2(origimage)./fft2(blurimageunpad));
imagesc(kernelc)
colormap gray
Run Code Online (Sandbox Code Playgroud)
结果如下:
https://i.stack.imgur.com/kJavg.jpg
这显然与该链接顶部提到的高斯模糊不匹配
我有兴趣优化一个函数,该函数是两个函数的卷积。主要问题是我的结果函数完全是规模化的,我不明白 np.convolve 实际做了什么。
我编写了一个小脚本,应该对两个高斯函数进行卷积,但生成的高斯函数的大小比输入函数大得多:
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
import numpy as np
# /sf/ask/1266224291/
def gauss(x, p): # p[0]==mean, p[1]==stdev, p[2]==heightg, p[3]==baseline
a = p[2]
mu = p[0]
sig = p[1]
#base = p[3]
return a * np.exp(-1.0 * ((x - mu)**2.0) / (2.0 * sig**2.0)) #+ base
p0 = [0, 0.3, 1] # Inital guess is a normal distribution
p02 = [0, 0.2, 0.5]
xp = np.linspace(-4, 4, 2000)
convolved = np.convolve(gauss(xp, p0),gauss(xp, p02), mode="same") …Run Code Online (Sandbox Code Playgroud) 我在 CNN 上观看Andrew Ng 的视频,想用滤波器6 x 6对图像进行卷积3 x 3。我用 numpy 处理这个问题的方法如下:
image = np.ones((6,6))
filter = np.ones((3,3))
convolved = np.convolve(image, filter)
Run Code Online (Sandbox Code Playgroud)
运行此命令会出现错误:
ValueError: object too deep for desired array
Run Code Online (Sandbox Code Playgroud)
我可以从convolve 的 numpy 文档中理解如何正确使用该convolve方法。
另外,有没有办法可以用 numpy 进行跨步卷积?
python numpy image-processing convolution conv-neural-network
我试图使用filter2D方法在OpenCV中找到卷积,但结果不正确
import cv2 as cv
import scipy.signal as sig
import numpy as np
b=np.asarray([[1,2,0,1,2],
[2,3,1,1,2],
[1,4,2,2,0],
[3,2,3,3,0],
[1,0,0,2,1]
],dtype=np.uint8)
w=np.asarray([[1,1,1],
[1,1,2],
[2,1,1]],dtype=np.uint8)
w_r=np.asarray([[1,1,1],
[2,1,1],
[1,1,1]
],dtype=np.uint8)
print(sig.convolve2d(b,w,mode="same"))
kernel_r=np.asarray([[1,1,1],[1,1,2],[2,1,1]])
print("-------")
print(cv.filter2D(b,-1,w_r))
Run Code Online (Sandbox Code Playgroud)
第一个输出是由 scipy.signal.convolve2D 生成的,这是正确的。第二个输出是由 OpenCV filter2D 生成的,这是不正确的。我怎样才能得到正确的结果。
[[ 8 10 10 7 7]
[15 18 20 14 9]
[18 23 26 18 10]
[15 21 22 16 11]
[ 8 13 13 9 8]]
-------
[[23 16 15 11 13]
[25 18 19 12 13]
[28 22 25 16 16]
[19 …Run Code Online (Sandbox Code Playgroud) 我理解应用于图像时的卷积滤波器(例如,具有 3 个输入通道的 224x224 图像由 56 个 5x5 转换的总共 56 个滤波器转换为具有 56 个输出通道的 224x224 图像)。关键是有 56 个不同的滤波器,每个滤波器的权重为 5x5x3,最终生成输出图像 224x224, 56(逗号后面的术语是输出通道)。
\n\n但我似乎无法理解conv1d过滤器在字符序列的 seq2seq 模型中如何工作。我正在查看的模型之一https://arxiv.org/pdf/1712.05884.pdf有一个“ post-net 层由 512 个形状为 5\xc3\x971 的滤波器组成”,在频谱图帧 80-d 上运行(意味着帧中有80个不同的浮点值),过滤的结果是512维的帧。
我不明白in_channels, out_channelspytorch conv1d 定义中的含义,就像在图像中一样,我可以轻松理解通道内/通道外的含义,但对于 80 个浮点值帧的序列,我不知所措。在上面这样的 seq2seq 模型的上下文中它们意味着什么?
对 80 个浮点值进行 512、5x1 过滤器如何生成 512 个浮点值?**
当对 80 个浮点值进行操作时,5x1 过滤器是否只会产生 80 个浮点值(通过在这 80 个值中一次取 5 个连续值)?这 512 个过滤器总共有多少权重?**
在 pytorch 中打印时的图层显示为:
\n\n(conv): Conv1d(80, 512, kernel_size=(5,), …Run Code Online (Sandbox Code Playgroud) 我正在尝试仅使用 NumPy 来实现图像卷积代码,类似于cv2.filter2D(...)的做法。
import numpy as np
import time
# kernal
H = np.array([[0,1,0],[1,-4,1],[0,1,0]])
# image
SEED = 23
img = np.random.RandomState(SEED).randint(10, size=(4, 4))
# shapes
Hi, Wi = img.shape
Hk, Wk = H.shape
hk = Hk//2
wk = Wk//2
# padding
new_img = np.pad(img, (hk, wk), 'constant', constant_values=0)
pHi, pWi = new_img.shape
print('img: ')
print(new_img)
print('kernal: ')
print(H)
print('\n')
# image convolution
##################################################
# Method 1
st = time.time()
out = np.zeros((Hi, Wi))
for i in range(hk, …Run Code Online (Sandbox Code Playgroud) 两个随机变量x和y之和的概率分布由各个分布的卷积给出.我在数字上做这个有点麻烦.在以下示例中,x和y均匀分布,其各自的分布近似为直方图.我的推理说直方图应该是复杂的,给出x + y的分布.
from numpy.random import uniform
from numpy import ceil,convolve,histogram,sqrt
from pylab import hist,plot,show
n = 10**2
x,y = uniform(-0.5,0.5,n),uniform(-0.5,0.5,n)
bins = ceil(sqrt(n))
pdf_x = histogram(x,bins=bins,normed=True)
pdf_y = histogram(y,bins=bins,normed=True)
s = convolve(pdf_x[0],pdf_y[0])
plot(s)
show()
Run Code Online (Sandbox Code Playgroud)
给出以下,

换句话说,如预期的那样是三角形分布.但是,我不知道如何找到x值.如果有人能在这里纠正我,我将不胜感激.
我有一个矩阵,[c, n, m]其中c有多个渠道。n和m是宽度和高度。在特定的示例中,我有一个具有1000个通道的矩阵。我想分别与a x a每个通道的大小的内核进行卷积。在我的示例中,内核大小为3 x 3。是否有任何功能,scipy或者numpy没有通过循环遍历通道的那种功能?
我找到了scipy.ndimage.convolve函数,但是我认为如果不使用循环就无法在该问题上应用该函数。
首先,这是我的问题的github链接.
这是我的问题:
我想用Python做一个面部比较功能.我可以使用OpenCV成功地(?)识别人脸.现在,我该如何做比较呢?
我的理解是这样的:
在一般的机器学习方法中,我需要收集关于该特定人的大量数据并使用CNN完成它.
但是,我刚收到2张图片,我该怎么做比较呢?我应该在分类或聚类方面考虑它(使用KNN)?
非常感谢您的所有帮助.
我是计算机视觉的新手。因此,我不知道以下代码的内部实现,因此无法调试该错误。任何人都可以在以下代码中指出错误吗?
该代码使用Box Filter和Edge detection Kernel矩阵的组合将停车图像转换为二进制图像。然后我试图找到轮廓。现在我知道可以在二进制图像上找到轮廓,可以使用cv2.threshold()函数导出轮廓,从Filter和Kernel矩阵获得的图像也不是二进制图像吗?
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('parking spot1.jpg',1)
k3 = np.array(([-1,-1,-1],[-1,8,-1],[-1,-1,-1]))
low_filter = cv2.boxFilter(img, -1, (4,4))
output_low = cv2.filter2D(low_filter, -1, k3)
plt.subplot(2, 2, 1)
plt.imshow(img)
plt.title('Original Image')
plt.subplot(2, 2, 2)
plt.imshow(output_low)
plt.title('matrix1')
plt.show()
img, ret, heirarchy = cv2.findContours(output_low, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
Run Code Online (Sandbox Code Playgroud)
您认为我做错了什么?我非常感谢您对此问题的解释或指导。
非常感谢。
我面临的错误是:
()最近追溯(最近一次通话)----> 1 img,ret,heirarchy = cv2.findContours(output_low,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
错误:OpenCV(3.4.3)/io/opencv/modules/imgproc/src/contours.cpp:199:错误:(-210:不支持的格式或格式组合)[开始]当模式!=时,FindContours仅支持CV_8UC1图像。 CV_RETR_FLOODFILL否则仅在函数'cvStartFindContours_Impl中支持CV_32SC1图像
opencv convolution computer-vision lowpass-filter opencv-contour
convolution ×10
python ×6
numpy ×5
opencv ×3
fft ×1
gaussian ×1
histogram ×1
lstm ×1
matlab ×1
probability ×1
pytorch ×1
scipy ×1
seq2seq ×1
statistics ×1