划分前景区域

原图

 划分区域后的图

import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread(r"train001.png", 0)#-1 cv2.IMREAD_UNCHANGED表示带有a通道   0表示灰度图cv2.IMREAD_GRAYSCALE 1表示三通道图cv2.IMREAD_COLOR 这里图片为灰度图,-1时读取得到的
                                     #读取图片时尽量对单通道操作
retval, connections = cv2.connectedComponents(img) #retval连通区域数量  connections连通区域,这里为前景 connection显示为图片后每个连通区域都有不同的颜色 图像上每一像素的标记,用数字1、2、3…表示(不同的数字表示不同的连通域)
plt.imshow(connections,cmap='gray')
plt.savefig("connections.png")

a = []
for j in range(1, retval):
    j_c = connections.copy()
    j_c[j_c != j] = 0
    j_c[j_c != 0] = 255
    j_c = j_c.astype('uint8')
    dst = cv2.distanceTransform((255 - j_c), cv2.DIST_L2, 3) #计算非零元素到最近零元素的距离
    plt.imshow(dst, cmap='gray')
    plt.savefig(str(j)+".png")
    a.append(dst)

mask = np.array(a)
mask = np.argmin(mask, axis=0)
mask = np.array(mask, dtype='uint8')#转换为无符号的8位

plt.figure()
plt.imshow(mask,cmap='gray')
plt.savefig("mask.png")
plt.show()

x = cv2.Sobel(mask, cv2.CV_16S, 1, 0)
y = cv2.Sobel(mask, cv2.CV_16S, 0, 1)

absX = cv2.convertScaleAbs(x)  # 转回uint8
absY = cv2.convertScaleAbs(y)

dst = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)#两个图片相加,0.5表示各自的权重,0表示在相加的基础上再加0
absX[absX>0]=255
absY[absY>0]=255
dst[dst>0]=255
r=dst+img
cv2.imshow("absX", absX)
cv2.imwrite("absX.png",absX)
cv2.imshow("absY", absY)
cv2.imwrite("absY.png",absY)
cv2.imshow("img", img)
cv2.imwrite("img.png",img)
cv2.imshow("Result", r)
cv2.imwrite("dst.png",r)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值