from PIL import Image
from pylab import *
import cv2
from numpy import *
from numpy.ma import array
from scipy.ndimage import filters
from PIL import Image
import imageio
def plane_sweep_ncc(im_l,im_r,start,steps,wid):
m,n=im_l.shape
mean_l=zeros((m,n))
mean_r=zeros((m,n))
s=zeros((m,n))
s_l=zeros((m,n))
s_r=zeros((m,n))
dmaps=zeros((m,n,steps))#保存深度平面数组
#计算图像块平均值
filters.uniform_filter(im_l,wid,mean_l)
filters.uniform_filter(im_r,wid,mean_r)
#归一化图像
norm_l=im_l-mean_l
norm_r=im_r-mean_r
#尝试不同视差
for displ in range(steps):
#将左边图像移动到右边计算加和
filters.uniform_filter(np.roll(norm_l,-displ-start)*norm_r,wid,s) # 和归一化
filters.uniform_filter(np.roll(norm_l,-displ-start)*np.roll(norm_l,-displ- start),wid,s_l)
filters.uniform_filter(norm_r*norm_r,wid,s_r)#和反归一化
#保存ncc分数
dmaps[:,:,displ]=s/sqrt(s_l*s_r)
#为每个像素选取最佳深度
return np.argmax(dmaps,axis=2)
im_l=array(Image.open(r'C:/Users/xpp/Desktop/Lena.png').convert('L'),'f')
im_r=array(Image.open(r'C:/Users/xpp/Desktop/Lena.png').convert('L'),'f')
#偏移并设置步长
steps=12
start=4
wid=8#nccu宽度
res=plane_sweep_ncc(im_l,im_r,start,steps,wid)
imageio.imwrite('C:/Users/xpp/Desktop/result.png',res)
算法:视差匹配是以图像对中任一幅图像为基准,其大小为该基准图像的大小,元素值为视差值的图像进行匹配。从立体图像对中提取包含了场景的距离信息的视差图进行匹配,一直是双目视觉研究中最为活跃的领域。
本文分享自 图像处理与模式识别研究所 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!