通常来说计算语义分割的评价指标时需要有两个文件,1、模型输出结果。2、真值
而stone331 数据集中有如下三个文件
文章图片
介绍如下:
文章图片
文件夹1的第一张图片为模型输入图片(image1):
文章图片
文件夹2的第一张图片为真值(gt1):
文章图片
文件夹3的第一张图片为一个蒙版图片(mask1):
文章图片
由于原图有白边,对预测结果有影响(除了预测出了裂缝,还包括上下的白边),所以预测结果如下(prediction1):
文章图片
这对计算评价指标肯定有较大的影响,因此利用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如下:
文章图片
下面执行相加操作:prediction1+img3=img4
文章图片
+
文章图片
=
文章图片
# 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)
输出如下:
文章图片
把img4中相应位置变成黑色,代码如下:
for i in index:
img5[i]=0
cv.imwrite('img5.png',img5)
文章图片
批量相加完整代码如下:
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数据集为例】
推荐阅读
- 优先队列(priority queue)和堆(heap)详解(二叉堆、d-堆、左式堆、斜堆和二项堆)
- 快速访问数据(散列表(Hash Table)实现原理和代码实例详解)
- Python MySQL删除查询使用详细指南
- Python使用Bokeh实现数据可视化实例教程详解
- Python计算字符串中子字符串数量的三种方法(findall、finditer和startswith)
- Python如何计算给定字符串中的重叠子字符串(——已解决)
- Python如何在字典(Dictionary)中找最近的键(——已解决)
- Python机器学习高阶实战!使用Tensorflow对象检测API训练图像分类器
- Python机器学习高级算法!谱聚类(Spectal Clustering)算法分析和实例详解