运动模糊修复:4 类实用算法及 OpenCV+Halcon 实战代码
介绍运动模糊修复的四种实用算法,包括维纳滤波、盲去卷积、非均匀去模糊及深度学习方案。针对工业视觉检测中高速产线导致的图像拖影问题,详细解析了各算法的核心逻辑、适用场景及优缺点。文章附带 OpenCV 与 Halcon 的实战代码示例,涵盖已知与未知模糊核的处理方法。此外,还总结了硬件优化、参数标定及预处理等工业落地技巧,帮助工程师提升缺陷检测精度与测量稳定性。

介绍运动模糊修复的四种实用算法,包括维纳滤波、盲去卷积、非均匀去模糊及深度学习方案。针对工业视觉检测中高速产线导致的图像拖影问题,详细解析了各算法的核心逻辑、适用场景及优缺点。文章附带 OpenCV 与 Halcon 的实战代码示例,涵盖已知与未知模糊核的处理方法。此外,还总结了硬件优化、参数标定及预处理等工业落地技巧,帮助工程师提升缺陷检测精度与测量稳定性。

做工业视觉检测的工程师大概率都遇过这种糟心情况:高速产线上的零件图像满是拖影,齿轮的齿廓糊成一片,芯片引脚的细节消失无踪;明明相机参数调得再准,只要零件一运动,缺陷检测就频频漏检,尺寸测量误差直接飙升到超标的程度。
这就是运动模糊在'搞破坏'——物体运动或相机抖动导致像素在曝光时间内拖影,使得图像细节丢失,成为工业视觉检测中'高速与高精度'之间的一大拦路虎。
今天就拆解恢复运动模糊图像的 4 类实用算法,从传统的盲去卷积到深度学习增强,还附上OpenCV 和 Halcon 的可运行代码,帮你在高速产线中也能拿到清晰图像,搞定缺陷检测和尺寸测量!
运动模糊不是图像'噪点',而是像素的空间位移叠加。简单来说,相机曝光的瞬间,运动的物体在成像平面上留下了'轨迹',这个轨迹的方向、长度就是模糊核(也叫点扩散函数 PSF)的关键参数:
工业场景中,运动模糊主要分两类:
搞懂这个本质就知道:运动模糊修复的核心是估计模糊核,再通过算法反向还原清晰图像。
关键调参:迭代次数是核心,工业场景中迭代 20-50 次即可平衡效果与速度,次数过多易出现噪声放大。
import cv2
import numpy as np
from scipy import signal
from scipy.fft import fft2, ifft2
def motion_kernel(length, angle):
"""生成运动模糊核(PSF)"""
angle = np.deg2rad(angle)
kernel = np.zeros((length, length))
center = length // 2
# 计算模糊核的像素坐标
x = np.linspace(-center, center, length)
y = np.round(x * np.tan(angle)).astype(int)
for i in range(length):
if center + y[i] >= 0 and center + y[i] < length:
kernel[center + y[i], i] = 1
# 归一化模糊核
kernel = kernel / kernel.sum()
return kernel
def wiener_deblur(img, kernel, K=0.01):
"""维纳滤波去模糊"""
# 傅里叶变换
img_fft = fft2(img)
kernel_fft = fft2(kernel, s=img.shape)
# 维纳滤波公式
kernel_fft_conj = np.conj(kernel_fft)
wiener = kernel_fft_conj / (np.abs(kernel_fft)**2 + K)
img_deblur_fft = img_fft * wiener
# 逆傅里叶变换
img_deblur = np.abs(ifft2(img_deblur_fft))
img_deblur = np.uint8(np.clip(img_deblur, 0, 255))
return img_deblur
def rl_blind_deconvolution(img, iterations=30):
"""Richardson-Lucy 盲去卷积"""
img = img.astype(np.float32)
img_est = np.copy(img)
kernel = np.ones((, )) /
i (iterations):
img_blur_est = signal.convolve2d(img_est, kernel, mode=, boundary=)
ratio = img / (img_blur_est + )
img_est *= signal.convolve2d(ratio, np.flip(kernel), mode=, boundary=)
img_est = np.uint8(np.clip(img_est, , ))
img_est
__name__ == :
img = cv2.imread(, )
kernel = motion_kernel(, )
img_wiener = wiener_deblur(img, kernel)
img_rl = rl_blind_deconvolution(img, iterations=)
result = np.hstack((img, img_wiener, img_rl))
cv2.imwrite(, result)
cv2.imshow(, result)
cv2.waitKey()
cv2.destroyAllWindows()
dev_close_window()
dev_open_window(0, 0, 1200, 400, 'black', WindowHandle)
*1. 读取图像与参数设置
read_image(ImgBlur, 'motion_blur.jpg') // 运动模糊图像
get_image_size(ImgBlur, Width, Height)
convert_image_type(ImgBlur, ImgBlurFloat, 'real')
*2. 生成运动模糊核(长度 15 像素,水平方向)
gen_kernel_motion(Kernel, 15, 0, 'constant', 'normalized')
*3. 维纳滤波去模糊
wiener_filter(ImgBlurFloat, ImgWiener, Kernel, 0.01, 'none')
convert_image_type(ImgWiener, ImgWienerByte, 'byte')
*4. 盲去卷积(Richardson-Lucy)
deconvolve_blind(ImgBlurFloat, ImgRL, Kernel, 30, 1, 'rl')
convert_image_type(ImgRL, ImgRLByte, 'byte')
*5. 显示结果
dev_display(ImgBlur)
disp_message(WindowHandle, 'Original Motion Blur', 'window', 10, 10, 'black', 'true')
dev_set_window_pos(WindowHandle, 0, Width + 20)
dev_display(ImgWienerByte)
disp_message(WindowHandle, 'Wiener Filter', 'window', 10, 10, 'black', 'true')
dev_set_window_pos(WindowHandle, 0, 2*Width + 40)
dev_display(ImgRLByte)
disp_message(WindowHandle, 'RL Blind Deconvolution', 'window', 10, 10, 'black', 'true')
* 输出统计信息
get_image_grayval(ImgBlur, Width/2, Height/2, GrayValBlur)
get_image_grayval(ImgWienerByte, Width/2, Height/2, GrayValWiener)
disp_message(WindowHandle, 'Blur Gray Value: ' + GrayValBlur, 'window', 30, 10, 'black', 'true')
disp_message(WindowHandle, 'Wiener Gray Value: ' + GrayValWiener, 'window', 30, 10, 'black', 'true')
gen_kernel_motion 和 wiener_filter 函数,更贴近工业视觉的实际应用,deconvolve_blind 函数简化了盲去卷积的迭代过程;运动模糊修复的关键是**'硬件优先,算法适配'**:先通过缩短曝光时间、使用全局快门相机减少模糊,再根据模糊核是否已知选择算法——
4 类算法从简单到复杂,按需选择就能在高速产线中拿到清晰图像,搞定缺陷检测和尺寸测量。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online