图像处理|opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例

通常来说计算语义分割的评价指标时需要有两个文件,1、模型输出结果。2、真值
而stone331 数据集中有如下三个文件
图像处理|opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例
文章图片

介绍如下:
图像处理|opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例
文章图片


文件夹1的第一张图片为模型输入图片(image1):
图像处理|opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例
文章图片


文件夹2的第一张图片为真值(gt1):
图像处理|opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例
文章图片

文件夹3的第一张图片为一个蒙版图片(mask1):
图像处理|opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例
文章图片

由于原图有白边,对预测结果有影响(除了预测出了裂缝,还包括上下的白边),所以预测结果如下(prediction1):
图像处理|opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例
文章图片


这对计算评价指标肯定有较大的影响,因此利用mask1去除prediction1的白边,得到和gt1那样正常的只含有裂缝的图片。
代码如下:

img1=cv.imread('738.png')#读取prediction1 print(img1.shape) img2=cv.imread('738.bmp')#读取gt1 print(img2.shape)r,img3=cv.threshold(img2,127,255,cv.THRESH_BINARY_INV)#将gt1反阈值化 print(img3.shape) cv.imwrite('img3.png',img3)#保存

对mask1反阈值化后得到 img3如下:
图像处理|opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例
文章图片

下面执行相加操作:prediction1+img3=img4
图像处理|opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例
文章图片
+图像处理|opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例
文章图片
= 图像处理|opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例
文章图片


# img=cv.addWeighted(img1,1,img2,1) img4=cv.add(img1,img3) cv.imwrite('img4.png',img4)

接下来需要把img4外面的白色变成黑色,这时利用mask1,只需要找出mask1黑色部分(像素为0)的坐标,然后把img4中相应位置的像素也变成黑色即可
利用numpy找出这些index
img5=img4#复制一份 l=np.where(img2<20)#找出黑色的坐标判断条件只要大于0即可 print(l) print(len(l))#为3,分别为 h w c

输出如下:
(array([0,0,0, ..., 511, 511, 511], dtype=int64), array([0,0,0, ..., 511, 511, 511], dtype=int64), array([0, 1, 2, ..., 0, 1, 2], dtype=int64)) 3

接下来把index转换成图片中的像素坐标
index=list(zip(l[0],l[1],l[2])) print(index)

输出如下:
图像处理|opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例
文章图片

把img4中相应位置变成黑色,代码如下:
for i in index: img5[i]=0 cv.imwrite('img5.png',img5)

图像处理|opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例
文章图片

批量相加完整代码如下:
import cv2 as cv import numpy as np import os prediction=r'D:\Crack_code\modecode-attention\\U2Net-Attention\\test_data\Stone 331\\U2Net_ECA_AS-pre\\'#预测图片路径 mask='D:\\Crack_code\\modecode-attention\\U2Net-Attention\\test_data\Stone 331\Stone331_mask\\'#掩膜路径 add_results='D:\\Crack_code\\modecode-attention\\U2Net-Attention\\test_data\Stone 331\\add_results\\'#保存最后结果的路径prediction_name=[] for f in os.listdir(path=prediction): # print(f) prediction_name.append(f.strip('png')) print(prediction_name)forname in prediction_name: img1 = cv.imread(prediction+name+'png') # print(img1.shape) img2 = cv.imread(mask+name+'bmp')#虽然gt是单通道但是opencv默认读取成3通道,所以img1.shape1==img2.shape # print(img2.shape) r, img3 = cv.threshold(img2, 127, 255, cv.THRESH_BINARY_INV)#对mask取反 img4 = cv.add(img1, img3) img5=img4 #找索引 l = np.where(img2 < 20) index = list(zip(l[0], l[1], l[2])) for i in index: img5[i]=0 cv.imwrite(add_results+name+'bmp',img5)

【图像处理|opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例】

    推荐阅读