我正在研究如何检测图像中灰度级别的变化,但只是在它们的某个区域内工作,我遇到了integral image。我认为它可以用于此,只需从图像中选择一个区域并将平均灰度级(或类似的东西)与其他区域进行比较。
但我的问题是,是否有可能(或有办法)计算我对一般图像感兴趣的特定区域的整体图像(重要区域混合在一般图像的不同部分)
干杯
答案 0 :(得分:2)
我不认为积分图像是完成此任务的最合适的工具。通过Numpy的any
和slicing比较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')
然后我们定义一个函数,只要有至少一个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