[我仅尝试使用OpenCV和python进行维纳反卷积,但出现此错误?

问题描述 投票:0回答:1

因此,我尝试对运动模糊的图像进行解卷积,图像的大小为840 * 1600像素,而不使用matlplotlib,skimage或PIL。我找到了下面的代码here

def motion_kernel(angle, d, sz=65):
    kern = np.ones((1, d), np.float32)
    c, s = np.cos(angle), np.sin(angle)
    A = np.float32([[c, -s, 0], [s, c, 0]])
    sz2 = sz // 2
    A[:,2] = (sz2, sz2) - np.dot(A[:,:2], ((d-1)*0.5, 0))
    kern = cv.warpAffine(kern, A, (sz, sz), flags=cv.INTER_CUBIC)
    return kern

当我输入我的图像时,它将引发此错误,并且在这里我也无法弄清楚sz的作用:

kern = cv.warpAffine(kern, A, (sz, sz), flags=cv.INTER_CUBIC)
cv2.error: OpenCV(4.1.1) C:\projects\opencv-python\opencv\modules\imgproc\src\imgwarp.cpp:2594: error: (-215:Assertion failed) src.cols > 0 && src.rows > 0 in function 'cv::warpAffine'

并且有任何方法可以修改此代码以对彩色图像(而不是灰度图像)进行模糊处理这是我的整个代码

from __future__ import print_function

import numpy as np
import cv2 as cv
import os 


codes_folder_path = os.path.abspath('.')
images_folder_path = os.path.abspath(os.path.join('..', 'Videos'))
generated_folder_path = os.path.abspath(os.path.join('..', 'Generated'))
win = 'deconvolution'
def blur_edge(img, d=31):
    h, w  = img.shape[:2]
    img_pad = cv.copyMakeBorder(img, d, d, d, d, cv.BORDER_WRAP)
    img_blur = cv.GaussianBlur(img_pad, (2*d+1, 2*d+1), -1)[d:-d,d:-d]
    y, x = np.indices((h, w))
    dist = np.dstack([x, w-x-1, y, h-y-1]).min(-1)
    w = np.minimum(np.float32(dist)/d, 1.0)
    return img*w + img_blur*(1-w)

def motion_kernel(angle, d, sz=65):
    kern = np.ones((1, d), np.float32)
    c, s = np.cos(angle), np.sin(angle)
    A = np.float32([[c, -s, 0], [s, c, 0]])
    sz2 = sz // 2
    A[:,2] = (sz2, sz2) - np.dot(A[:,:2], ((d-1)*0.5, 0))
    kern = cv.warpAffine(kern, A, (sz, sz), flags=cv.INTER_CUBIC)
    return kern
def main():
    val = input('time:')
    cap = cv.VideoCapture(images_folder_path+"/"+"video.mp4")
    fps = cap.get(cv.CAP_PROP_FPS)
    frame_seq = int(val)*fps
    cap.set(1,frame_seq)
    ret, frame = cap.read()
    print(frame.shape)
    img = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
    img = np.float32(img)/255.0
    cv.imshow('input', img)

    img = blur_edge(img)
    IMG = cv.dft(img, flags=cv.DFT_COMPLEX_OUTPUT)

    def update(_):
        ang = np.deg2rad( cv.getTrackbarPos('angle', win) )
        d = cv.getTrackbarPos('d', win)
        noise = 10**(-0.1*cv.getTrackbarPos('SNR (db)', win))
        psf = motion_kernel(ang, d)
        cv.imshow('psf', psf)

        psf /= psf.sum()
        psf_pad = np.zeros_like(img)
        kh, kw = psf.shape
        psf_pad[:kh, :kw] = psf
        PSF = cv.dft(psf_pad, flags=cv.DFT_COMPLEX_OUTPUT, nonzeroRows = kh)
        PSF2 = (PSF**2).sum(-1)
        iPSF = PSF / (PSF2 + noise)[...,np.newaxis]
        RES = cv.mulSpectrums(IMG, iPSF, 0)
        res = cv.idft(RES, flags=cv.DFT_SCALE | cv.DFT_REAL_OUTPUT )
        res = np.roll(res, -kh//2, 0)
        res = np.roll(res, -kw//2, 1)
        cv.imshow(win, res)
    cv.namedWindow(win)
    cv.namedWindow('psf', 0)
    cv.createTrackbar('angle', win,0, 180, update)
    cv.createTrackbar('d', win,0, 50, update)
    cv.createTrackbar('SNR (db)', win, 0, 50, update)
    update(None)
    while True:
        ch = cv.waitKey()
        if ch == 27:
            break

    print('Done')

if __name__ == '__main__':
    #print(__doc__)
    main()
    cv.destroyAllWindows()

谢谢!

python opencv image-processing motion-blur
1个回答
0
投票

IITM的您好,您是电子烟的参与者吗?

© www.soinside.com 2019 - 2024. All rights reserved.