import queue
import cv2
from PIL import Image
def cfs(img):
"""传入二值化后的图片进行连通域分割"""
pixdata = img.load()
w,h = img.size
visited = set()
q = queue.Queue()
offset = [(-1,-1),(0,-1),(1,-1),(-1,0),(1,0),(-1,1),(0,1),(1,1)]
cuts = []
for x in range(w):
for y in range(h):
x_axis = []
y_axis = []
if pixdata[x,y] == 0 and (x,y) not in visited:
q.put((x,y))
visited.add((x,y))
while not q.empty():
x_p,y_p = q.get()
for x_offset,y_offset in offset:
x_c,y_c = x_p+x_offset,y_p+y_offset
if (x_c,y_c) in visited:
continue
visited.add((x_c,y_c))
try:
if pixdata[x_c,y_c] == 0:
q.put((x_c,y_c))
x_axis.append(x_c)
y_axis.append(y_c)
except:
pass
if x_axis:
min_x,max_x = min(x_axis),max(x_axis)
if max_x - min_x > 3:
# 宽度小于3的认为是噪点,根据需要修改
cuts.append((min_x,max_x))
return cuts
def vertical(img):
"""传入二值化后的图片进行垂直投影"""
pixdata = img.load()
w,h = img.size
ver_list = []
# 开始投影
for x in range(w):
black = 0
for y in range(h):
if pixdata[x,y] == 0:
black += 1
ver_list.append(black)
# 判断边界
l,r = 0,0
flag = False
cuts = []
for i,count in enumerate(ver_list):
# 阈值这里为0
if flag is False and count > 0:
l = i
flag = True
if flag and count == 0:
r = i-1
flag = False
cuts.append((l,r))
return cuts
if __name__ == '__main__':
# img = cv2.imread("two\\tt15.jpg")
img = Image.open("two\\tt15.jpg")
cuts = cfs(img)
print("cfs:",cuts)
# for i, n in enumerate(cuts, 1):
# temp = img.crop(n) # 调用crop函数进行切割
# temp.save("results//cut%s.jpg" % i)
# b_img = binarizing(b_img, 200)
v = vertical(img)
print("vertical:",v)
CFS连通域分割法
最新推荐文章于 2024-03-31 21:20:59 发布
该博客主要介绍了两种图像处理技术:连通域分割(CFS)和垂直投影。CFS用于去除二值化图像中的噪点,通过遍历像素并使用队列实现连通区域的标记和分割。垂直投影则通过统计每一列黑色像素的数量,找出连续的黑色区域,用于检测图像的边界。这两个方法对于图像分析和分割具有重要意义。
摘要由CSDN通过智能技术生成