反向投影法

  反向投影法是用已知图像的某些特征来突出其它图像中此类特征的一种方法,基于直方图。

  主要步骤如下:

  1、统计已知图像某个特征的色度直方图,通常用色度-饱和度(Hue-Saturation)来统计二维直方图,并把直方图表示为概率的形式。

  2、选取测试图像,对于图像中的每一个像素,查看它的色度在已统计直方图上的概率,用这个概率来重建整张图像。

  3、最后把重建出的图像归一化,会发现用于统计直方图的特征被突出出来。

  举OpenCV的例子,已知图像如下:

  我们称之为模型。选取图中的手作为要统计的特征,它的mask如下:

  于是可以统计得到手的Hue-Saturation直方图和联合概率分布(看做相互独立)的热度图:

  测试图片是另一张手的图像:

  然后执行第三步:

  可以发现手被突出出来了,这是因为,相同物体在不同的图像中的色值通常是相近的,因此可以通过这种方式来突出它。如果把上图当做mask对原测试图进行遮罩,还可以把手的图片单独提取出来:

  Python代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
  
#获取mask、model、test图像数据,并进行预处理
mask = plt.imread('mask.jpg')[:,:,0] 
mask = ((mask<120)*255).astype(np.uint8) 
n = np.sum(mask>100)
model = cv2.cvtColor(plt.imread('model.jpg'),cv2.COLOR_RGB2HSV)#把RGB颜色空间转换为HSV
test = cv2.cvtColor(plt.imread('test.jpg'),cv2.COLOR_RGB2HSV) 

#根据色度和饱和度(明度不考虑),统计model颜色信息,并绘制直方图和它们联合分布的热度图
hist_size = 50  #直方图划分的区间数量
hist_h = cv2.calcHist([model],[0],mask,[hist_size],[0,256])/n
hist_s = cv2.calcHist([model],[1],mask,[hist_size],[0,256])/n 
hot_values = np.matmul(hist_s, hist_h.T) 

fig = plt.figure()
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
ax1.bar(range(len(hist_h)),hist_h[:,0])
ax1.bar(range(len(hist_s)),hist_s[:,0])  
hot = ax2.imshow(hot_values)
plt.colorbar(hot)
plt.show()
  
#使用热度图重建test图像
projection = np.zeros([test.shape[0],test.shape[1]])
for i in range(projection.shape[0]):
  for j in range(projection.shape[1]):
    h_pos = (test[i,j,0]/256*hist_size).astype(np.uint8)
    s_pos = (test[i,j,1]/256*hist_size).astype(np.uint8) 
    projection[i,j] = hist_h[h_pos] * hist_s[s_pos]  
 
projection = projection / np.max(projection)
plt.imshow(projection,cmap='gray') 
plt.show()

#用反向投影法重建的图像当做mask提取原图
recons = cv2.cvtColor(test,cv2.COLOR_HSV2RGB)*(projection[:,:,np.newaxis] > 0.00005)
plt.imshow(recons) 
plt.show()

  我们还可以用RGB来统计,建立RGB的三维联合分布,然后对测试图像进行重建,效果如下:

  可以看出突出效果并没有H-S模型来得好。代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
  
mask = plt.imread('mask.jpg')[:,:,0] 
mask = ((mask<120)*255).astype(np.uint8) 
n = np.sum(mask>100)
model = plt.imread('model.jpg')
test = plt.imread('test.jpg') 
hist_size = 50  #直方图划分的区间数量
hist_r = cv2.calcHist([model],[0],mask,[hist_size],[0,256])[:,0]/n
hist_g = cv2.calcHist([model],[1],mask,[hist_size],[0,256])[:,0]/n
hist_b = cv2.calcHist([model],[2],mask,[hist_size],[0,256])[:,0]/n
  
plt.bar(range(len(hist_r)),hist_r)
plt.bar(range(len(hist_g)),hist_g)
plt.bar(range(len(hist_b)),hist_b)
plt.show()

projection = np.zeros([test.shape[0],test.shape[1]])
for i in range(projection.shape[0]):
  for j in range(projection.shape[1]):
    r_pos = (test[i,j,0]/256*hist_size).astype(np.uint8)
    g_pos = (test[i,j,1]/256*hist_size).astype(np.uint8)
    b_pos = (test[i,j,2]/256*hist_size).astype(np.uint8)
    projection[i,j] = hist_r[r_pos] * hist_g[g_pos] * hist_b[b_pos]
 
projection = projection / np.max(projection)
plt.imshow(projection,cmap='gray') 
plt.show()

   参考自:https://docs.opencv.org/master/da/d7f/tutorial_back_projection.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在MATLAB中,迭代反投影(Iterative Reconstruction)是一种常用于图像重建的方,特别是在CT扫描等领域。 迭代反投影的思想基于反投影原理,通过测量得到的一系列投影数据,逆向投影到空间中的每个像素点,以重建出图像。但由于投影数据的有限性和噪声的存在,直接反投影得到的图像通常会出现伪影和模糊等问题。因此,迭代反投影引入了迭代优化的思想,通过反复迭代的方式逐步改进图像重建的效果。 在MATLAB中,可以使用Radon变换函数radon来得到投影数据,将得到的投影数据代入重建算中进行迭代。常见的迭代反投影包括ART(代数重建技术)和MLEM(最大似然期望最大化)等。 迭代反投影的基本步骤如下: 1. 通过Radon变换得到投影数据。 2. 初始化图像重建的初始估计值,通常为全黑或全白。 3. 循环迭代以下步骤直到达到指定的迭代次数或满足停止准则: a. 对当前估计的图像进行正向投影,得到当前估计对应的投影数据。 b. 计算投影数据的差异与实际投影数据之间的差异,即误差。 c. 将误差反向投影回图像空间,即进行反投影操作。 d. 更新估计的图像,将反投影得到的差异累加到当前估计上。 4. 最终得到的估计图像即为重建结果。 需要注意的是,迭代反投影的重建结果受到多种因素的影响,如迭代次数、投影数据质量、初始化估计值等。因此,在实际应用中需要根据具体情况来选择合适的参数,并对重建结果进行评估和调优。 ### 回答2: MATLAB中的迭代反投影(Iterative Back Projection)是一种重建图像的方,常用于计算机断层扫描(CT)等领域。 迭代反投影的基本思想是通过多次反投影和更新进行重建,将一组投影数据转化为对应的图像。其步骤如下: 1. 初始化:首先,根据图像的大小和所需的像素值,创建一个初始的零值图像。通常,可以使用MATLAB的zeros函数来完成这个步骤。 2. 投影数据准备:将原始的投影数据转换为MATLAB可以处理的格式。这可能涉及到对数据进行相应的预处理,例如去噪、滤波等。 3. 反投影:对每个投影角度,根据当前图像估计,通过将投影值分散到每个与该射线相交的像素上来进行反投影。 4. 更新:在完成所有投影角度的反投影后,根据所有反投影结果更新当前图像的估计。这可以通过将每个像素上的反投影值相加来实现。 5. 收敛判据:根据选定的收敛判据,对更新后的估计图像进行判断。如果满足收敛条件,则算结束。否则,返回步骤3继续反投影和更新。 6. 图像重建:根据最终的估计图像,可以使用MATLAB的图像重建函数生成重建图像。常用的函数包括imresize、imadjust等。 需要注意的是,迭代反投影是一种迭代的重建方,需要根据实际问题设置合适的参数和迭代次数,以及选择合适的收敛判据来保证算的准确性和稳定性。 总之,迭代反投影是MATLAB中用于重建图像的一种常用方,通过多次反投影和更新,将投影数据转化为对应的图像。这个算可以广泛应用于计算机断层扫描等领域。 ### 回答3: 在MATLAB中,迭代反投影(Iterative Reconstruction)是一种用于图像重建的数学算。该算适用于从投影数据中重建二维或三维图像。 迭代反投影基于以下原理:首先,从多个不同角度获取物体的投影数据,这些数据反映了物体在不同方向上的吸收特性。然后,通过迭代的方式,反向投影这些投影数据,将其重建为原始物体的图像。 该算的实现步骤如下: 1. 首先,定义一个适当的空间来保存重建图像,这个空间通常是一个二维或三维的矩阵。 2. 针对每个投影角度,将逆投影(反投影)操作应用于投影数据,并将其添加到重建图像的对应位置。逆投影的过程将投影数据通过逆变换(如Radon变换的逆变换)映射回原始图像空间。 3. 重复上述步骤,直到所有投影角度的数据都被反投影到重建图像上。这些迭代可以持续几十次甚至上百次,以改善重建图像的质量。 4. 最后,对重建图像进行后处理,如去噪或增强细节。该过程可以使用各种图像处理技术来实现。 需要注意的是,迭代反投影是一种计算密集型算,因此在实际应用中,计算机的处理能力和算的优化对于实现高质量的重建结果至关重要。 总而言之,MATLAB中的迭代反投影是一种常用的图像重建算,通过从投影数据中反投影图像重构物体的形状和吸收分布。这一过程需要在不断迭代的过程中,将反投影的结果累积到重建图像上,以获得更精确的图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值