朴素贝叶斯分类器与Fisher线性判别实践——水果识别为例( 二 )

< 0.000001:break# 计算梯度下降方法两类投影中心Gpro0 = np.matmul(Wgrad, u0.T)Gpro1 = np.matmul(Wgrad, u1.T)# 测试集检验zql1 = test(wf, pro0, pro1)zql2 = test(Wgrad, Gpro0, Gpro1)print("Fisher(LDA)分类正确率为:")print(zql1)print("梯度下降法分类正确率为:")print(zql2)
(二)朴素贝叶斯
import osimport cv2import numpy as np# 本次算法采用朴素贝叶斯分类 , 各分类特征假定符合相互独立条件# 采用最大后验概率判别def preProcess(OriResize):# 转HSV颜色空间利用饱和度去除白色背景HSV = cv2.cvtColor(OriResize, cv2.COLOR_BGR2HSV)# 通过实验发现所使用背景可利用s_min=40的饱和度去除lower = np.array([0, 40, 0])upper = np.array([179, 255, 255])mask = cv2.inRange(HSV, lower, upper)# 进行高斯模糊blur = cv2.GaussianBlur(mask, (7, 7), 1)return blur# 计算返回查找表(行从上到下:苹果、香蕉、柠檬、猕猴桃)def searchT(apl, bal, lel, kil):st = []ap = np.array(apl)ba = np.array(bal)le = np.array(lel)ki = np.array(kil)ap1 = ap.sum(axis=0)ba1 = ba.sum(axis=0)le1 = le.sum(axis=0)ki1 = ki.sum(axis=0)ap2 = list(ap1 / ap1[15])ba2 = list(ba1 / ba1[15])le2 = list(le1 / le1[15])ki2 = list(ki1 / ki1[15])st.append(ap2[0:15])st.append(ba2[0:15])st.append(le2[0:15])st.append(ki2[0:15])return st# p(yi)列表def pyL():global appleCglobal bananaCglobal lemonCglobal kiwifruitCtotal = appleC + bananaC + lemonC + kiwifruitCp = []p.append(appleC/total)p.append(bananaC/total)p.append(lemonC/total)p.append(kiwifruitC/total)return p# 获取样本数据(B、G、R目标均值)SampleFiles = os.listdir(r"D:\ThirdGhomework\classification\BayesSamples")# 图像目标预处理# 储存DN区间个数表(0 , 51],[52 , 103],[104 , 155],[156 , 207],[208 , 254]appleDN = []bananaDN = []lemonDN = []kiwifruitDN = []# 各水果类别计数(计算P(yi))appleC = 0bananaC = 0lemonC = 0kiwifruitC = 0for imgname in SampleFiles:count = []# 单样本DN区间计数a(0 , 51],b[52 , 103],c[104 , 155],d[156 , 207],e[208 , 254]ra, rb, rc, rd, re = 0, 0, 0, 0, 0ba, bb, bc, bd, be = 0, 0, 0, 0, 0ga, gb, gc, gd, ge = 0, 0, 0, 0, 0# 记录提取目标总像素个数tcount = 0imgpath = os.path.join(r"D:\ThirdGhomework\classification\BayesSamples", imgname)Img = cv2.imread(imgpath)# 调整图片长宽像素比调整显示大小shape = Img.shapeOriResize = cv2.resize(Img, (shape[0] // 2, shape[1] // 2))binary = preProcess(OriResize)MultOJ = cv2.bitwise_and(OriResize, OriResize, mask=binary)B, G, R = cv2.split(MultOJ)shape = OriResize.shapeheight = shape[0]width = shape[1]# 正式开始获取颜色特征# Rfor i in range(height):for j in range(width):if not R[i][j] == 0:tcount += 1if 0 < R[i][j] <= 51:ra += 1elif 51 < R[i][j] <= 103:rb += 1elif 103 < R[i][j] <= 155:rc += 1elif 155 < R[i][j] <= 207:rd += 1else:re += 1# Gfor i in range(height):for j in range(width):if 0 < G[i][j] <= 51:ga += 1elif 51 < G[i][j] <= 103:gb += 1elif 103 < G[i][j] <= 155:gc += 1elif 155 < G[i][j] <= 207:gd += 1else:ge += 1# Bfor i in range(height):for j in range(width):if 0 < B[i][j] <= 51:ba += 1elif 51 < B[i][j] <= 103:bb += 1elif 103 < B[i][j] <= 155:bc += 1elif 155 < B[i][j] <= 207:bd += 1else:be += 1count.append(ra)count.append(rb)count.append(rc)count.append(rd)count.append(re)count.append(ga)count.append(gb)count.append(gc)count.append(gd)count.append(ge)count.append(ba)count.append(bb)count.append(bc)count.append(bd)count.append(be)count.append(tcount)if imgname.startswith("apple"):appleC += 1appleDN.append(count)elif imgname.startswith("banana"):bananaDN.append(count)bananaC += 1elif imgname.startswith("lemon"):lemonDN.append(count)lemonC += 1else:kiwifruitDN.append(count)kiwifruitC += 1ST = searchT(appleDN, bananaDN, lemonDN, kiwifruitDN)py = pyL()# 样本测试testpath = input("请输入测试图片的绝对路径(使用\\):")Imgtest = cv2.imread(testpath)# 调整图片长宽像素比调整显示大小OriResizet = cv2.resize(Imgtest, (600, 900))binaryt = preProcess(OriResizet)MultOJt = cv2.bitwise_and(OriResizet, OriResizet, mask=binaryt)Bt, Gt, Rt = cv2.split(MultOJt)shapett = OriResizet.shapeheightt = shapett[0]widtht = shapett[1]testcount = 0RDN, GDN, BDN = 0, 0, 0for i in range(heightt):for j in range(widtht):if not Rt[i][j] == 0:testcount += 1RDN += Rt[i][j]for i in range(heightt):for j in range(widtht):if not Gt[i][j] == 0:GDN += Gt[i][j]for i in range(heightt):for j in range(widtht):if not Bt[i][j] == 0:BDN += Bt[i][j]RDN /= testcountBDN /= testcountGDN /= testcount# 取概率标志位rj = 0bj = 0gj = 0# r标识if 0