I amd trying to read a datamatrix code on the metal surface. The datamatrix code was engraved with laser welding. I tried pylibdmtx with image preprocessing.
Data Matrix Code engraved with Laser on Metal Surface
Here is my code and the result. Unfortunately, I could not read the data from the preprocessed image.
import cv2
import numpy as np
'''
1. Image Read
2. Image Process
a. gray scale
b. crop image
c. EqualizeHist
d. Thres Binaray 152
e. Blur
f. Threshod otsu
g. bitwise not
3. Result image save
'''
# crop image
def crop_image(image, min_x, max_x, min_y, max_y):
# Load the image
# Get image dimensions
height, width = image.shape[:2]
print(height, width)
# Calculate the crop sizes
crop_left = int(min_x * width)
crop_right = int((1 - max_x) * width)
crop_top = int(min_y * height)
crop_bottom = int((1 - max_y) * height)
print(crop_left, crop_right)
# Crop the image
cropped_image = image[crop_top:crop_bottom, crop_left:crop_right]
print(cropped_image.shape)
# Return the cropped image
return cropped_image
# cv2 createTrackbar
def empty(x):
pass
cv2.namedWindow('Parameters')
cv2.resizeWindow('Parameters', width=600, height=400)
cv2.createTrackbar('min_x', 'Parameters', 38, 100, empty) # crop x
cv2.createTrackbar('max_x', 'Parameters', 36, 100, empty) # crop x
cv2.createTrackbar('min_y', 'Parameters', 43, 100, empty) # crop x
cv2.createTrackbar('max_y', 'Parameters', 10, 100, empty) # crop x
cv2.createTrackbar('threshold', 'Parameters', 136, 255, empty) # threshold
cv2.createTrackbar('k_size_set', 'Parameters', 18, 20, empty) # blur
cv2.createTrackbar('k_mat_set', 'Parameters', 2, 5, empty) #k_mat
cv2.createTrackbar('iter_d', 'Parameters', 2, 30, empty) # 5
cv2.createTrackbar('iter_e', 'Parameters', 4, 30, empty) # 5
img = cv2.imread('./image/live.png')
# Gray Scale
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# resize
img = cv2.resize(img, dsize=None, fx=0.5, fy=0.5)
# -----------------------------------------------
#
# -----------------------------------------------
while True:
## 00. Make a Copy
img_copy = img.copy()
img_black = np.zeros_like(img)
# 1. Crop Image
dx_min = cv2.getTrackbarPos('min_x', 'Parameters')
dx_max = cv2.getTrackbarPos('max_x', 'Parameters')
dy_min = cv2.getTrackbarPos('min_y', 'Parameters')
dy_max = cv2.getTrackbarPos('max_y', 'Parameters')
dx_min, dx_max = dx_min / 100, dx_max / 100
dy_min, dy_max = dy_min / 100, dy_max / 100
img_crop = crop_image(image=img_copy, min_x=dx_min, max_x=dx_max, min_y=dy_min, max_y=dy_max)
# 3 Equalize hist
img_hist = cv2.equalizeHist(img_crop)
# 4. Thres Binaray 152
thres = cv2.getTrackbarPos('threshold', 'Parameters')
_, img_thresh = cv2.threshold(img_hist, thres, 255, cv2.THRESH_BINARY)
# 5. Gaussian Blur
kernel = cv2.getTrackbarPos('k_size_set', 'Parameters')
kernel = (kernel * 2) + 1
img_blur = cv2.GaussianBlur(img_thresh, (kernel, kernel), None)
# 6. Threshod otsu
_, img_thresh2 = cv2.threshold(img_blur, 0, 255, cv2.THRESH_OTSU)
# 7kernel : dilate , erodeのkernelの定義に注意
kernel2 = cv2.getTrackbarPos('k_mat_set', 'Parameters')
kernel2 = (kernel2 * 2) + 1
k_mat = np.ones((kernel2, kernel2), np.uint8)
# 8. Dilate
iter_dilate = cv2.getTrackbarPos('iter_d', 'Parameters')
img_dilate = cv2.dilate(img_thresh2, kernel=k_mat, iterations=iter_dilate)
# 9. Erode
iter_erode = cv2.getTrackbarPos('iter_e', 'Parameters')
img_erode = cv2.erode(img_dilate, kernel=k_mat, iterations=iter_erode)
# Plotting
cv2.imshow('result2' ,img_erode)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.imwrite('./image/result2.png', img_erode)
print('saved')
cv2.destroyAllWindows()
Here is my image preprocessing procedures:
Image Read
Image Process a. gray scale b. crop image c. EqualizeHist d. Thres Binaray e. Blur f. Threshod otsu g. bitwise not
Result image save