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

通常来说计算语义分割的评价指标时需要有两个文件,1、模型输出结果。2、真值

而stone331 数据集中有如下三个文件

opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例_第1张图片

介绍如下:

opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例_第2张图片

文件夹1的第一张图片为模型输入图片(image1):

opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例_第3张图片

文件夹2的第一张图片为真值(gt1):

opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例_第4张图片

文件夹3的第一张图片为一个蒙版图片(mask1):

opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例_第5张图片

 由于原图有白边,对预测结果有影响(除了预测出了裂缝,还包括上下的白边),所以预测结果如下(prediction1):

opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例_第6张图片

这对计算评价指标肯定有较大的影响,因此利用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数据集为例_第7张图片

 下面执行相加操作:prediction1+img3=img4

opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例_第8张图片+   opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例_第9张图片    = opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例_第10张图片

# 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)

opencv python图像批量相加cv2.add(img1,img2),以stone331数据集为例_第11张图片

 批量相加  完整代码如下:

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)

for  name 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)

你可能感兴趣的:(图像处理,python,opencv)