-
Notifications
You must be signed in to change notification settings - Fork 0
/
Process_Image.py
59 lines (46 loc) · 2.19 KB
/
Process_Image.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
import cv2
import os
import random
def seperate_letters():
#read the one image from Images folder
try:
image_path = os.listdir('InputImage')[0]
except:
print('There are no files in /InputImage.')
image = cv2.imread('InputImage/'+image_path, 0)
#Apply Gaussian blur to reduce noise-Used ChatGPT to do this
blurred_image = cv2.GaussianBlur(image, (5,5),0)
#Adjust contrast and brightness
processed_image = cv2.convertScaleAbs(blurred_image, alpha=1.5, beta=10)
#color-inversion
inverted_image = 255-processed_image
inverted_image[inverted_image < 100] = 0
inverted_image[inverted_image >= 100] = 255
# Find contours in the binary image
contours, _ = cv2.findContours(inverted_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
#Sort the contours based on x-values so the letters are in order
sorted_contours = sorted(contours, key=lambda contour: cv2.boundingRect(contour)[0])
#Use image copy instead of image so the contour lines are not printed
padding = 5 # You can change this value
for i, contour in enumerate(sorted_contours):
# Filter out small contours that may be noise
if cv2.contourArea(contour) > 200:
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 1)
# Add padding to the bounding box
x -= padding
y -= padding
w += 2 * padding
h += 2 * padding
# Ensure the bounding box stays within the image boundaries
x = max(0, x)
y = max(0, y)
w = min(inverted_image.shape[1] - x, w)
h = min(inverted_image.shape[0] - y, h)
# Extract the letter from the original image with padding
letter = inverted_image[y:y+h, x:x+w]
#resize the images to 25x25 so there are 500 features
letter = cv2.resize(letter, (28,28))
# Save the letter as a separate image
cv2.imwrite(f"IndividualLetters/letter_{i}.png", letter)
cv2.imwrite(f'ArchivedImages/image_with_contours{random.randint(1,1000)}.jpg', image)