如何使用积分图像检测ROI内部的强度变化?

时间:2018-01-02 08:28:29

标签: python image-processing computer-vision roi

我正在研究如何检测图像中灰度级别的变化,但只是在它们的某个区域内工作,我遇到了integral image。我认为它可以用于此,只需从图像中选择一个区域并将平均灰度级(或类似的东西)与其他区域进行比较。

但我的问题是,是否有可能(或有办法)计算我对一般图像感兴趣的特定区域的整体图像(重要区域混合在一般图像的不同部分)

干杯

1 个答案:

答案 0 :(得分:2)

我不认为积分图像是完成此任务的最合适的工具。通过Numpy的anyslicing比较ROI中的强度值,可以轻松实现ROI中强度变化的检测,如下所示。

首先,我们导入必要的模块并加载一些示例图像:

<adminobject>
     <adminobject-interface>javax.jms.Queue</adminobject-interface>
     <adminobject-class>org.apache.activemq.command.ActiveMQQueue</adminobject-class>
     <config-property>
        <config-property-name>PhysicalName</config-property-name>
        <config-property-type>java.lang.String</config-property-type>
        <config-property-value>IP_NAME</config-property-value>
     </config-property>
  </adminobject>

这是图像的外观:

import numpy as np
from skimage import io
import matplotlib.pyplot as plt

reference = io.imread('https://i.stack.imgur.com/9fmvl.png')
same = io.imread('https://i.stack.imgur.com/u1wlT.png')
changed = io.imread('https://i.stack.imgur.com/H2dIu.png')

Sample images

然后我们定义一个函数,只要有至少一个ROI像素,其测试图像的强度与参考图像的强度不同,就会返回fig, [ax0, ax1, ax2] = plt.subplots(1, 3) ax0.imshow(reference) ax0.axis('off') ax0.set_title('Reference') ax1.imshow(same) ax1.axis('off') ax1.set_title('Same') ax2.imshow(changed) ax2.axis('off') ax2.set_title('Changed') plt.show(fig)

True

最后,我们只需要设置ROI(红色方块)并使用适当的参数调用def detect_change(ref, img, roi): upper, left, lower, right = roi return np.any(ref[upper:lower, left:right] != img[upper:lower, left:right])

detect_change