-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpreprocess.py
130 lines (103 loc) · 4.28 KB
/
preprocess.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import cv2
import numpy as np
import os
import logging
from utils import read_yaml, file_exists
logging_str = "[%(asctime)s: %(levelname)s: %(module)s]: %(message)s"
log_dir = "logs"
os.makedirs(log_dir, exist_ok=True)
logging.basicConfig(filename=os.path.join(log_dir,"ekyc_logs.log"), level=logging.INFO, format=logging_str, filemode="a")
config_path = "config.yaml"
config = read_yaml(config_path)
artifacts = config['artifacts']
intermediate_dir_path = artifacts['INTERMIDEIATE_DIR']
conour_file_name = artifacts['CONTOUR_FILE']
def read_image(image_path, is_uploaded=False):
if is_uploaded:
try:
# Read image using OpenCV
image_bytes = image_path.read()
# image_array = np.frombuffer(image_bytes, np.uint8) # converts the bytes object into a NumPy array.
# img = cv2.imdecode(image_array, cv2.IMREAD_COLOR) # decodes the NumPy array into an image format that OpenCV can process
img = cv2.imdecode(np.frombuffer(image_bytes, np.uint8), cv2.IMREAD_COLOR)
if img is None:
logging.info("Failed to read image: {}".format(image_path))
raise Exception("Failed to read image: {}".format(image_path))
return img
except Exception as e:
logging.info(f"Error reading image: {e}")
print("Error reading image:", e)
return None
else:
try:
img = cv2.imread(image_path)
if img is None:
logging.info("Failed to read image: {}".format(image_path))
raise Exception("Failed to read image: {}".format(image_path))
return img
except Exception as e:
logging.info(f"Error reading image: {e}")
print("Error reading image:", e)
return None
def extract_id_card(img):
"""
Extracts the ID card from an image containing other backgrounds.
Args:
img (np.ndarray): The input image.
Returns:
np.ndarray: The cropped image containing the ID card, or None if no ID card is detected.
"""
# Convert image to grayscale
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Noise reduction
blur = cv2.GaussianBlur(gray_img, (5, 5), 0)
# Adaptive thresholding
thresh = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
# Find contours
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Select the largest contour (assuming the ID card is the largest object)
largest_contour = None
largest_area = 0
for cnt in contours:
area = cv2.contourArea(cnt)
if area > largest_area:
largest_contour = cnt
largest_area = area
# If no large contour is found, assume no ID card is present
if not largest_contour.any():
return None
# Get bounding rectangle of the largest contour
x, y, w, h = cv2.boundingRect(largest_contour)
logging.info(f"contours are found at, {(x, y, w, h)}")
# logging.info("Area largest_area)
# Apply additional filtering (optional):
# - Apply bilateral filtering for noise reduction
# filtered_img = cv2.bilateralFiltering(img[y:y+h, x:x+w], 9, 75, 75)
# - Morphological operations (e.g., erosion, dilation) for shape refinement
current_wd = os.getcwd()
filename = os.path.join(current_wd,intermediate_dir_path, conour_file_name)
contour_id = img[y:y+h, x:x+w]
is_exists = file_exists(filename)
if is_exists:
# Remove the existing file
os.remove(filename)
cv2.imwrite(filename, contour_id)
return contour_id, filename
def save_image(image, filename, path="."):
"""
Saves an image to a specified path with the given filename.
Args:
image (np.ndarray): The image data (NumPy array).
filename (str): The desired filename for the saved image.
path (str, optional): The directory path to save the image. Defaults to "." (current directory).
"""
# Construct the full path
full_path = os.path.join(path, filename)
is_exists = file_exists(full_path)
if is_exists:
# Remove the existing file
os.remove(full_path)
# Save the image using cv2.imwrite
cv2.imwrite(full_path, image)
logging.info(f"Image saved successfully: {full_path}")
return full_path