图像分割和数字¶
直方图处理图像¶
(从网上找的例图)
1.横向切割处理¶
分割上下边框¶
把图像分为上下两部分,根据像素点的个数,找到最小的像素行(最小波谷)。 上半部分的最小波谷作为顶,下半部分的最小波谷作为底。
2、纵向分割¶
切割字符。
每一个字符前面都一定会有波谷出现,波谷出现再上升的时候,作为字符开始的判断标志。
四.统计各行各列白色像素个数(为绘制直方图做准备)¶
# 二-5、统计白色像素点(分别统计每一行、每一列)
def White_Statistic(image):
ptx = [] # 每行白色像素个数
pty = [] # 每列白色像素个数
height, width = image.shape
# 逐行遍历
for i in range(height):
num = 0
for j in range(width):
if(image[i][j]==255):
num = num+1
ptx.append(num)
# 逐列遍历
for i in range(width):
num = 0
for j in range(height):
if (image[j][i] == 255):
num = num + 1
pty.append(num)
return ptx, pty
五、绘制直方图(横、纵)¶
有了直方图,可以很直观地看出每一行、每一列的像素分布情况。
# 二-6、绘制直方图
def Draw_Hist(ptx, pty):
# 依次得到各行、列
rows, cols = len(ptx), len(pty)
row = [i for i in range(rows)]
col = [j for j in range(cols)]
# 横向直方图
plt.barh(row, ptx, color='black', height=1)
# 纵 横
plt.show()
# 纵向直方图
plt.bar(col, pty, color='black', width=1)
# 横 纵
plt.show()
六、分割车牌图像¶
# 二-7、分割车牌图像(根据直方图)
def Cut_Image(ptx, pty, binary, dilate):
h1 = h2 = 0
#顶 底
begin = False #标记开始/结束
# 1、依次得到各行、列
rows, cols = len(ptx), len(pty)
row = [i for i in range(rows)]
col = [j for j in range(cols)]
# 2、横向分割:上下边框
h1, h2 = Cut_X(ptx, rows)
# 3、纵向分割:分割字符
Cut_Y(pty, cols, h1, h2, binary)
1、横向分割:分割上下边框¶
把图像分为两部分:上半图和下半图,分别找到它们的波谷,就可以确定字符上下边缘,进行分割。
1、下半图波谷¶
在下半图找波谷,确定字符的下边缘。
# 1、下半图波谷
min, r = 300, 0
for i in range(int(rows / 2)):
if ptx[i] < min:
min = ptx[i]
r = i
h1 = r # 添加下行(作为顶)
2、上半图波谷¶
在上半图找波谷,确定字符的上边缘。
# 2、上半图波谷
min, r = 300, 0
for i in range(int(rows / 2), rows):
if ptx[i] < min:
min = ptx[i]
r = i
h2 = r # 添加上行(作为底)
(pid也学了,但是没实操就不往上写了)