added corners,edges,counters to FV

This commit is contained in:
Denys Seredenko
2024-10-19 17:31:56 +02:00
parent 7eb53df831
commit 8f0e8fd7fe
6 changed files with 48 additions and 65 deletions

View File

@@ -1,50 +0,0 @@
import cv2
import numpy as np
from os import walk
import csv
def detect_corners(gray_image, max_corners=100, quality_level=0.14, min_distance=1):
corners = cv2.goodFeaturesToTrack(cv2.blur(gray_image, (5,5)), maxCorners=max_corners, qualityLevel=quality_level, minDistance=min_distance)
if corners is not None:
corners = np.int0(corners)
return len(corners), corners
else:
return 0, []
def detect_edges(gray_image):
edges = cv2.Canny(cv2.blur(gray_image, (5,5)), threshold1=100, threshold2=200)
edge_count = np.count_nonzero(edges)
return edge_count, edges
def detect_contours(edge_image):
contours, _ = cv2.findContours(edge_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contour_count = len(contours)
return contour_count, contours
def feature_vector(image_path):
resultVector = {}
img = cv2.imread(image_path)
image_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
corners_count, _ = detect_corners(image_gray)
edges_count, edges = detect_edges(image_gray)
contours_count, _ = detect_contours(edges)
resultVector["corners"] = corners_count % 100
resultVector["edges"] = edges_count / 1000
resultVector["contours"] = contours_count * 0.1
return resultVector
filenames = next(walk("images"), (None, None, []))[2] # [] if no file
with open('dict.csv', 'w') as csv_file:
writer = csv.DictWriter(csv_file, fieldnames=['corners', 'edges', 'contours'])
writer.writeheader()
for filename in filenames:
result = feature_vector(f'images/{filename}')
writer.writerow(result)

View File

@@ -1 +1,2 @@
opencv-python opencv-python
np

View File

@@ -1,13 +1,14 @@
import os import os
import csv
import cv2 as cv import cv2 as cv
from featue_extraction import get_color_percentage, get_raster_color_percentage from featue_extraction import get_color_percentage, get_raster_color_percentage, get_edges, get_corners, get_contours
from feature_vector import FeatureVector from feature_vector import FeatureVector
from concept import Concept from concept import Concept
from feature import Feature from feature import Feature
img_path = "D:/uni/master/machine_learning/StreetsignRecognition/data/processed" img_path = "/Users/denysseredenko/StreetsignRecognition/data"
vector_path = "D:/uni/master/machine_learning/StreetsignRecognition/data/vectors" vector_path = "/Users/denysseredenko/StreetsignRecognition/vector"
def get_concept(path) -> Concept: def get_concept(path) -> Concept:
if "fahrtrichtung_links" in path: if "fahrtrichtung_links" in path:
@@ -36,12 +37,18 @@ if __name__ == "__main__":
for fname in fnames: for fname in fnames:
image_path = os.path.join(dirpath, fname) image_path = os.path.join(dirpath, fname)
print(image_path)
try: try:
# extract features # prepare image
image = cv.imread(image_path) image = cv.imread(image_path)
gray_image = cv.imread(image_path, cv.IMREAD_GRAYSCALE)
#extract features
color_percentage_overall = get_color_percentage(image) color_percentage_overall = get_color_percentage(image)
color_percentage_rasters = get_raster_color_percentage(image, 4, 4) color_percentage_rasters = get_raster_color_percentage(image, 4, 4)
# add more edges_amount, edged_image = get_edges(gray_image)
edges_amount = round(edges_amount / 1000)
corners_amount = get_corners(gray_image)
contours_amount = get_contours(edged_image)
except Exception: except Exception:
print("Failed for ", image_path) print("Failed for ", image_path)
@@ -53,9 +60,12 @@ if __name__ == "__main__":
continue continue
vec: FeatureVector = FeatureVector(concept) vec: FeatureVector = FeatureVector(concept)
vec.add_feature(Feature.CORNERS, corners_amount)
vec.add_feature(Feature.EDGES, edges_amount)
vec.add_feature(Feature.COUNTOURS, contours_amount)
vec.add_feature(Feature.OVERALL_COLOR_PERCENTAGE, color_percentage_overall) vec.add_feature(Feature.OVERALL_COLOR_PERCENTAGE, color_percentage_overall)
vec.add_feature(Feature.RASTER_COLOR_PERCENTAGE, color_percentage_rasters) vec.add_feature(Feature.RASTER_COLOR_PERCENTAGE, color_percentage_rasters)
# add more
print(vec.get_vector()) print(vec.get_vector())
vec_path = os.path.join(save_path, fname) vec_path = os.path.join(save_path, fname.split('.')[0])
vec.save(vec_path) vec.save(vec_path)

View File

@@ -67,3 +67,23 @@ def get_raster_color_percentage(image: cv.Mat, rows: int, cols: int) -> list[lis
ret.append(new) ret.append(new)
return ret return ret
def get_edges(gray_image: cv.Mat):
edges = cv.Canny(cv.blur(gray_image, (5,5)), threshold1=100, threshold2=200)
edge_count = np.count_nonzero(edges)
return edge_count, edges
def get_corners(gray_image: cv.Mat):
max_corners = 100
quality_level = 0.14
min_distance = 1
corners = cv.goodFeaturesToTrack(cv.blur(gray_image, (5,5)), maxCorners=max_corners, qualityLevel=quality_level, minDistance=min_distance)
if corners is not None:
corners = np.int0(corners)
return len(corners)
else:
return 0
def get_contours(edged_gray_image: cv.Mat):
contours, _ = cv.findContours(edged_gray_image, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
contour_count = len(contours)
return contour_count

View File

@@ -5,3 +5,4 @@ class Feature(Enum):
RASTER_COLOR_PERCENTAGE = auto() RASTER_COLOR_PERCENTAGE = auto()
CORNERS = auto() CORNERS = auto()
EDGES = auto() EDGES = auto()
COUNTOURS = auto()

View File

@@ -26,7 +26,6 @@ class FeatureVector:
feature_data: dict feature_data: dict
for val in feature_data.values(): for val in feature_data.values():
ret.append(val) ret.append(val)
print(ret)
return ret return ret
elif feature == Feature.RASTER_COLOR_PERCENTAGE: elif feature == Feature.RASTER_COLOR_PERCENTAGE:
@@ -36,15 +35,17 @@ class FeatureVector:
for data in feature_data1d: for data in feature_data1d:
for val in data.values(): for val in data.values():
ret.append(val) ret.append(val)
print(ret)
return ret return ret
elif feature == Feature.CORNERS: elif feature == Feature.CORNERS:
#feature_data: int #? ret.append(feature_data)
return [-1] return ret
elif feature == Feature.EDGES: elif feature == Feature.EDGES:
#feature_data: int #? ret.append(feature_data)
return [-1] return ret
elif feature == Feature.COUNTOURS:
ret.append(feature_data)
return ret
def add_feature(self, key: Feature, value: Any) -> None: def add_feature(self, key: Feature, value: Any) -> None: