|
|
import cv2
|
|
|
import numpy as np
|
|
|
from PIL import Image
|
|
|
import config
|
|
|
from utils import get_roi
|
|
|
from model_handler import model_handler
|
|
|
|
|
|
def detect_straight_lines(roi_img):
|
|
|
"""Enhanced edge detection focusing on straight lines."""
|
|
|
gray = cv2.cvtColor(roi_img, cv2.COLOR_BGR2GRAY)
|
|
|
clahe = cv2.createCLAHE(
|
|
|
clipLimit=config.DETECTION_PARAMS['clahe_clip_limit'],
|
|
|
tileGridSize=config.DETECTION_PARAMS['clahe_grid_size']
|
|
|
)
|
|
|
enhanced = clahe.apply(gray)
|
|
|
blurred = cv2.GaussianBlur(
|
|
|
enhanced,
|
|
|
config.DETECTION_PARAMS['gaussian_kernel'],
|
|
|
config.DETECTION_PARAMS['gaussian_sigma']
|
|
|
)
|
|
|
edges = cv2.Canny(
|
|
|
blurred,
|
|
|
config.DETECTION_PARAMS['canny_low'],
|
|
|
config.DETECTION_PARAMS['canny_high']
|
|
|
)
|
|
|
line_mask = np.zeros_like(edges)
|
|
|
lines = cv2.HoughLinesP(
|
|
|
edges,
|
|
|
rho=1,
|
|
|
theta=np.pi/180,
|
|
|
threshold=config.DETECTION_PARAMS['hough_threshold'],
|
|
|
minLineLength=config.DETECTION_PARAMS['min_line_length'],
|
|
|
maxLineGap=config.DETECTION_PARAMS['max_line_gap']
|
|
|
)
|
|
|
if lines is not None:
|
|
|
for line in lines:
|
|
|
x1, y1, x2, y2 = line[0]
|
|
|
cv2.line(line_mask, (x1, y1), (x2, y2), 255, 2)
|
|
|
return line_mask
|
|
|
|
|
|
def simple_edge_detection(roi_img):
|
|
|
"""Simple edge detection."""
|
|
|
gray = cv2.cvtColor(roi_img, cv2.COLOR_BGR2GRAY)
|
|
|
return cv2.Canny(gray, 50, 150)
|
|
|
|
|
|
def ribbon(image_path):
|
|
|
"""Detect the presence of a ribbon in an image."""
|
|
|
image = cv2.imread(image_path)
|
|
|
if image is None:
|
|
|
raise ValueError(f"Could not read image: {image_path}")
|
|
|
|
|
|
h, w = image.shape[:2]
|
|
|
edge_present = []
|
|
|
|
|
|
for i, roi in enumerate(config.ROIS):
|
|
|
x1, y1, x2, y2 = [int(coord * (w if i % 2 == 0 else h)) for i, coord in enumerate(roi)]
|
|
|
roi_img = image[y1:y2, x1:x2]
|
|
|
|
|
|
if i < 6:
|
|
|
edges = detect_straight_lines(roi_img)
|
|
|
edge_present.append(np.sum(edges) > edges.size * config.DETECTION_PARAMS['edge_pixel_threshold'])
|
|
|
else:
|
|
|
edges = simple_edge_detection(roi_img)
|
|
|
edge_present.append(np.any(edges))
|
|
|
|
|
|
result = all(edge_present[:6]) and not edge_present[6] and not edge_present[7] and not edge_present[8]
|
|
|
return {"No Ribbon": 0 if result else 1}
|
|
|
|
|
|
def image_quality(image_path):
|
|
|
"""
|
|
|
Check if an image is low resolution or poor quality.
|
|
|
"""
|
|
|
try:
|
|
|
image = Image.open(image_path)
|
|
|
width, height = image.size
|
|
|
pixel_count = width * height
|
|
|
|
|
|
if width < config.MIN_WIDTH or height < config.MIN_HEIGHT or pixel_count < config.MIN_PIXEL_COUNT:
|
|
|
return {"Bad Image Quality": 1}
|
|
|
|
|
|
grayscale_image = image.convert("L")
|
|
|
pixel_array = np.array(grayscale_image)
|
|
|
variance = np.var(pixel_array)
|
|
|
|
|
|
if variance < config.PIXEL_VARIANCE_THRESHOLD:
|
|
|
return {"Bad Image Quality": 1}
|
|
|
|
|
|
return {"Bad Image Quality": 0}
|
|
|
|
|
|
except Exception as e:
|
|
|
print(f"Error processing image: {e}")
|
|
|
return {"Bad Image Quality": 1}
|
|
|
|
|
|
def gnc(image_path):
|
|
|
"""Check for gestures/coach marks and display the image."""
|
|
|
image = get_roi(image_path, *config.GNC)
|
|
|
gnc_text = model_handler.intern(image, config.PGNC, 900).lower()
|
|
|
|
|
|
return {"Visual Gesture or Icon": 1 if 'yes' in gnc_text else 0}
|
|
|
|