基于连通性分析的黑边去除

2024-01-28  本文已影响0人  大龙10

书名:数字图像处理实战
作者:杨坦 张良均
出版社:人民邮电出版社有限公司
出版时间:2023-11-01
ISBN:9787115623850


第9章 钢轨表面缺陷检测

9.3 图像预处理

9.3.2 基于连通性分析的黑边去除

1、基于连通性分析去除黑边
2、过程代码

基于连通性分析去除黑边的完整实现过程如代码9-3所示。

img_gray3 = img_gray2.copy ( )  
# 区域生长算法,将连通区域变白
def dfs(i, j, my img, yuzhi=255) :
  img = my_img.copy()
  N = len(img)
  M = len(img[0])
  img_flag = np.zeros_like(img) # 记录点的使用
  shengzhang=[]
  area = 1
  shengzhang.append( [i,j] )  # 记录种子点的位置
  while len(shengzhang) > 0:
    img[ shengzhang[-1][0] ] [shengzhang[-1][1] ] = 255
    # 种子点使用后将其像素值变为255
    img_flag[shengzhang[-1][0]][shengzhang[-1][1]]= 1 
    # 并在img_flag 中记录信息
    x = shengzhang[-1][0]
    y = shengzhang[-1][1]
    shengzhang.pop()
    #种子点使用完成,弹出种子点
    for dx in [-1, 0, 1]:
      for dy in [-1, 0, 1]:
        nx = x + dx
        ny = y + dy
        # 使用8连通的方法填充像素点
        if  0<= nx < N and 0<= ny < M and img[nx][ny]<yuzhi:
        # 将非纯白像素变为白色
          area = area + 1
          shengzhang.append([nx,ny])
  return area, img, img_flag

for i in list(range(img_gray.shape[0])[: 10]) + list(range(img_gray.shape[0])[-10:])  :
  for j in range(img_gray.shape[1]):
   _, img_gray3, _ = dfs(i,j, img_gray3)

3、区域生长算法的函数dfs
4、去除黑边的效果
5、去除微小黑点连通区域
# 去除微小黑点的连通区域
img_gray4 = img_gray3.copy()
min_area = 100
img_flag = np.zeros_like(img_gray)
label =0   # 连通区域数量
for i in range(len(img_gray)):
  for j in range(len(img_gray[0])):
    if img_gray4[i][j]!= 255 and img_flag[i][j]==0 :
      area, new_img, new_img_flag = dfs(i, j,img_gray4)  # 计算当前连通区域面积
      if area > min_area: # 判断是否满足最小面积要求
        label = label + 1
        print(label)
        # 添加当前连通区域至连通区域标记,标记值为该连通区域编号
        img_flag = np.where(new_img_flag != 0, label,img_flag)
      else:
        print( 'area:{0}'.format(area))  # 显示连通区域的面积
        img_gray4 = new_img


上一篇下一篇

猜你喜欢

热点阅读