|
|
import os as _os |
|
|
import cv2 as _cv2 |
|
|
import numpy as _np |
|
|
import glob as _glob |
|
|
import joblib as _jb |
|
|
import matplotlib.pyplot as _plt |
|
|
|
|
|
from skimage.feature import local_binary_pattern as _lbp, graycomatrix as _gcm, graycoprops as _gcp |
|
|
from sklearn.model_selection import train_test_split as _tts |
|
|
from sklearn.metrics import classification_report as _cr, accuracy_score as _acc |
|
|
from sklearn.svm import SVC as _S |
|
|
from sklearn.ensemble import RandomForestClassifier as _RF |
|
|
from sklearn.linear_model import LogisticRegression as _LR |
|
|
|
|
|
|
|
|
def generateAngles(): |
|
|
angs = [_np.pi * i / 5 for i in range(5)] |
|
|
s = "1.2,2.2,3.1" |
|
|
dists = [float(x) for x in s.split(",")] |
|
|
return angs, dists |
|
|
|
|
|
(_bestangles, _bestglcmdist) = generateAngles() |
|
|
|
|
|
|
|
|
_bestpoints = 9 |
|
|
_bestradius = 1 |
|
|
|
|
|
|
|
|
def generateSVM_Args(): |
|
|
kern = 'linear' |
|
|
Cval = 2.1 |
|
|
gamma = 'scale' |
|
|
rs = 42 |
|
|
return {'kernel': kern, 'C': Cval, 'gamma': gamma, 'random_state': rs} |
|
|
|
|
|
|
|
|
def generateRF_Args(): |
|
|
ne = 110 |
|
|
rs = 40 |
|
|
nj = -1 |
|
|
return {'n_estimators': ne, 'random_state': rs, 'n_jobs': nj} |
|
|
|
|
|
|
|
|
def generateLR_Args(): |
|
|
mc = 'multinomial' |
|
|
solv = 'lbfgs' |
|
|
mi = 900 |
|
|
rs = 37 |
|
|
return {'multi_class': mc, 'solver': solv, 'max_iter': mi, 'random_state': rs} |
|
|
|
|
|
|
|
|
def fun_colorA(img): |
|
|
return _cv2.calcHist([img], [0,1,2], None, (5,5,5), [0,256,0,256,0,256]) |
|
|
|
|
|
|
|
|
def fun_colorB(hist_raw): |
|
|
_cv2.normalize(hist_raw, hist_raw) |
|
|
return hist_raw.flatten() |
|
|
|
|
|
|
|
|
def fun_color(img): |
|
|
return fun_colorB(fun_colorA(img)) |
|
|
|
|
|
|
|
|
def lbpGray(img): |
|
|
return _cv2.cvtColor(img, _cv2.COLOR_BGR2GRAY) |
|
|
|
|
|
|
|
|
def lbpMap(gray_img): |
|
|
return _lbp(gray_img, _bestpoints, _bestradius, method='uniform') |
|
|
|
|
|
|
|
|
def lbpHist(lbp_map): |
|
|
bins = _np.arange(0, _bestpoints + 3) |
|
|
h, _ = _np.histogram(lbp_map.ravel(), bins=bins, range=(0, _bestpoints + 2)) |
|
|
h = h.astype('float') |
|
|
return h / (h.sum() + 1e-6) |
|
|
|
|
|
|
|
|
def lbpFeature(img): |
|
|
g = lbpGray(img) |
|
|
lm = lbpMap(g) |
|
|
return lbpHist(lm) |
|
|
|
|
|
|
|
|
def glcmGray(img): |
|
|
return _cv2.cvtColor(img, _cv2.COLOR_BGR2GRAY) |
|
|
|
|
|
|
|
|
def glcmMatrix(gray_img): |
|
|
return _gcm(gray_img, distances=_bestglcmdist, angles=_bestangles, symmetric=True, normed=True) |
|
|
|
|
|
|
|
|
def glcmProperties(glcm_mat, prop_name): |
|
|
return _gcp(glcm_mat, prop_name).flatten() |
|
|
|
|
|
|
|
|
def glcmFeature(img): |
|
|
gray = glcmGray(img) |
|
|
glcm = glcmMatrix(gray) |
|
|
features = [] |
|
|
properties = ["contrast", "dissimilarity", "homogeneity", "energy"] |
|
|
for prop in properties: |
|
|
features.extend(glcmProperties(glcm, prop)) |
|
|
return _np.array(features) |
|
|
|
|
|
|
|
|
def huGray(img): |
|
|
return _cv2.cvtColor(img, _cv2.COLOR_BGR2GRAY) |
|
|
|
|
|
|
|
|
def huMoments(img): |
|
|
g = huGray(img) |
|
|
m = _cv2.moments(g) |
|
|
return _cv2.HuMoments(m).flatten() |
|
|
|
|
|
|
|
|
def FullFeautures(pathF): |
|
|
img = _cv2.imread(pathF) |
|
|
if img is None: |
|
|
print(f"[Warning] cannot read {pathF}") |
|
|
return None |
|
|
|
|
|
|
|
|
ch = fun_color(img) |
|
|
lbph = lbpFeature(img) |
|
|
glc = glcmFeature(img) |
|
|
hu = huMoments(img) |
|
|
|
|
|
fv = [] |
|
|
|
|
|
fv.extend(ch) |
|
|
fv.extend(lbph) |
|
|
fv.extend(glc) |
|
|
fv.extend(hu) |
|
|
|
|
|
return _np.array(fv) |