使用OpenCV解卷积?

Val*_*itz 6 c++ opencv image-processing

有没有办法用OpenCV进行反卷积?

我对这里所展示的改进印象深刻

来自https://web.archive.org/web/20160402174700/http://www.olympusmicro.com/primer/digitalimaging/deconvolution/images/deconalgorithmsfigure1.jpg

并希望将此功能添加到我的软件中.

编辑(赏金的附加信息.)

我还没弄清楚如何实现反卷积.这段代码可以帮助我锐化图像,但我认为解卷积可以做得更好.

void ImageProcessing::sharpen(QImage & img)
{
    IplImage* cvimg = createGreyFromQImage( img );
    if ( !cvimg ) return;

    IplImage* gsimg = cvCloneImage(cvimg );
    IplImage* dimg = cvCreateImage( cvGetSize(cvimg), IPL_DEPTH_8U, 1 );
    IplImage* outgreen = cvCreateImage( cvGetSize(cvimg), IPL_DEPTH_8U, 3 );
    IplImage* zeroChan = cvCreateImage( cvGetSize(cvimg), IPL_DEPTH_8U, 1 );
    cvZero(zeroChan);

    cv::Mat smat( gsimg, false );
    cv::Mat dmat( dimg, false );

    cv::GaussianBlur(smat, dmat, cv::Size(0, 0), 3);
    cv::addWeighted(smat, 1.5, dmat, -0.5 ,0, dmat);
    cvMerge( zeroChan, dimg, zeroChan, NULL, outgreen);

    img = IplImage2QImage( outgreen );
    cvReleaseImage( &gsimg );
    cvReleaseImage( &cvimg );
    cvReleaseImage( &dimg );
    cvReleaseImage( &outgreen );
    cvReleaseImage( &zeroChan );
}
Run Code Online (Sandbox Code Playgroud)

希望提供有用的提示!

Mai*_*mon 9

当然,您可以使用OpenCV编写反卷积代码.但是还没有准备好使用函数.

要开始,您可以查看此示例,该示例显示了使用OpenCV在Python中实现Wiener Deconvolution.

这是另一个使用C的示例,但这是从2012年开始的,所以它可能已经过时了.


Ale*_*x I 5

最近邻解卷积是一种通常用于光学显微镜中 Z 平面中的图像堆栈的技术。这篇评论论文:Jean-Baptiste Sibarita。反卷积显微镜。Adv Biochem Engin/Biotechnol (2005) 95: 201–243 涵盖了很多使用的技术,包括您感兴趣的技术。这也是一个不错的介绍:http : //blogs.fe.up.pt/BioinformaticsTools /显微镜/

这个 numpy+scipy python 示例展示了它是如何工作的:

from pylab import *
import numpy
import scipy.ndimage

width = 100
height = 100
depth = 10
imgs = zeros((height, width, depth))

# prepare test input, a stack of images which is zero except for a point which has been blurred by a 3D gaussian
#sigma = 3
#imgs[height/2,width/2,depth/2] = 1
#imgs = scipy.ndimage.filters.gaussian_filter(imgs, sigma)

# read real input from stack of images img_0000.png, img_0001.png, ... (total number = depth)
# these must have the same dimensions equal to width x height above
# if imread reads them as having more than one channel, they need to be converted to one channel
for k in range(depth):
    imgs[:,:,k] = scipy.ndimage.imread( "img_%04d.png" % (k) )

# prepare output array, top and bottom image in stack don't get filtered
out_imgs = zeros_like(imgs)
out_imgs[:,:,0] = imgs[:,:,0]
out_imgs[:,:,-1] = imgs[:,:,-1]

# apply nearest neighbor deconvolution
alpha = 0.4 # adjustabe parameter, strength of filter
sigma_estimate = 3 # estimate, just happens to be same as the actual

for k in range(1, depth-1):
    # subtract blurred neighboring planes in the stack from current plane
    # doesn't have to be gaussian, any other kind of blur may be used: this should approximate PSF
    out_imgs[:,:,k] = (1+alpha) * imgs[:,:,k]  \
        - (alpha/2) * scipy.ndimage.filters.gaussian_filter(imgs[:,:,k-1], sigma_estimate) \
        - (alpha/2) * scipy.ndimage.filters.gaussian_filter(imgs[:,:,k+1], sigma_estimate)

# show result, original on left, filtered on right
compare_img = copy(out_imgs[:,:,depth/2])
compare_img[:,:width/2] = imgs[:,:width/2,depth/2]
imshow(compare_img)
show()
Run Code Online (Sandbox Code Playgroud)