学习目标:图像处理课程作业,基于阈值处理图片。
原图:
学习产出:
import cv2 as cv
import numpy as np
#T分割照片为G1和G2,并计算其平均值
def threshold(img,T):
rows = img.shape[0]
columns = img.shape[1]
G1=G2=0
g1=g2=0
for i in range(rows):
for j in range(columns):
if img[i,j]>T:
G1+=img[i,j]
g1+=1
else:
G2+=img[i,j]
g2+=1
m1=int(G1/g1)
m2=int(G2/g2) # m1,m2计算两组像素均值
T0=int((m1+m2)/2) # 据公式计算新的阈值
return T0
def choose(img,T):
rows = img.shape[0]
columns = img.shape[1]
img1=np.zeros((rows,columns),np.uint8)
T0=T
T1=threshold(img,T0)
for k in range (100): # 迭代次数为经验值,可据实际情况选定
if abs(T1-T0) < 3: # 若新阈值减旧阈值差值小于三,则为二值图最佳阈值
for i in range(rows):
for j in range(columns):
if img[i,j]>T1:
img1[i,j]=255
else:
img1[i,j]=0
break
else:
T2=threshold(img,T1)
#变量转换,保证if条件为新阈值减旧阈值
T0=T1
T1=T2
return img1
image=cv.imread('word.jpg',cv.IMREAD_GRAYSCALE)
threshold_image=choose(image,115)
cv.imshow("threshold_image",threshold_image)
cv.waitKey(0)
cv.destroyAllWindows()
结果: