我正在分析加速老化测试的图像。我想在电极和总样品设置的图表上显示表面上发生的累积放电总量,以供参考。
图片的总大小等于样本的大小。它是一个5厘米×120厘米的矩形。这是累积图像。
在累积图中,由于所有活动都发生在电极之间,因此方面不那么矩形,所以当先前对帧进行求和时,我拒绝了不在电极之间的区域,以提高性能。
该图像是使用具有喷射着色的matplotlib生成的。因此,它最初是一个数据矩阵。为了将它添加到参考图片,我将此图像保存为png并重新加载。此操作稍微改变了纵横比,但稍后我正确调整了它的大小。
我已使用此功能添加到尺寸与原始素材相同的白色矩形。最初我添加了顶部和底部电极的缩放到白色背景图像。
def overlay(background_img, img_to_overlay_t, x, y, negpos, overlay_size=None):
bg_img = background_img.copy()
if overlay_size is not None:
img_to_overlay_t = cv.resize(img_to_overlay_t.copy(), overlay_size)
# Extract the alpha mask of the RGBA image, convert to RGB
b,g,r,a = cv.split(img_to_overlay_t)
overlay_color = cv.merge((b,g,r))
# Apply some simple filtering to remove edge noise
mask = cv.medianBlur(a,5)
#mask = np.zeros(source_img.shape[:2], np.uint8)
h, w, _ = overlay_color.shape
roi = bg_img[y:y+h, x:x+w]
## works sort of but with removed details
#mask = mask.astype(np.int8)
# Black-out the area behind the logo in our original ROI
img1_bg = cv.bitwise_and(roi.copy(),roi.copy(),mask = cv.bitwise_not(mask))
# Mask out the logo from the logo image.
img2_fg = cv.bitwise_and(overlay_color,overlay_color,mask = mask)
img2_fg = img2_fg.astype(np.float32)
img1_bg = img1_bg.astype(np.float32)
if negpos == False:
bg_img[y:y+h, x:x+w] = cv.subtract(img1_bg, img2_fg)
else:
bg_img[y:y+h, x:x+w] = cv.add(img1_bg, img2_fg)
return bg_img
到目前为止,一切都很顺利。问题是试图在电极之间增加累积。我的问题在于无法将累积图插入电极的参考布局图像和总样本大小。我得到了
OpenCV(3.4.1) Error: Assertion failed ((mtype == 0 || mtype == 1) && _mask.sameSize(*psrc1))
at
img1_bg = cv.bitwise_and(roi.copy(),roi.copy(),mask = cv.bitwise_not(mask))
我可以通过将掩码转换为uint8或int8来解决这个问题
mask = mask.astype(np.uint8)
这有它自己的问题,因为蓝色放电部分最终会丢失所有功能,并且基本上只包含3种不同的颜色。
这是我想在最后显示/保存的结果。我不知道怎么做到这一点。