Skip to content

Instantly share code, notes, and snippets.

@tori29umai0123
Created May 18, 2024 01:11
Show Gist options
  • Save tori29umai0123/0ce5ee40d53e59d729d440dccfc4220f to your computer and use it in GitHub Desktop.
Save tori29umai0123/0ce5ee40d53e59d729d440dccfc4220f to your computer and use it in GitHub Desktop.
flatLine.py
#https://github.com/Kazuhito00/XDoG-OpenCV-Sample
import os
import cv2
import numpy as np
def DoG_filter(image, kernel_size=0, sigma=1.0, k_sigma=2.0, gamma=1.5):
g1 = cv2.GaussianBlur(image, (kernel_size, kernel_size), sigma)
g2 = cv2.GaussianBlur(image, (kernel_size, kernel_size), sigma * k_sigma)
return g1 - gamma * g2
def XDoG_filter(image, kernel_size=0, sigma=1.4, k_sigma=1.6, epsilon=0, phi=10, gamma=0.98):
epsilon /= 255
dog = DoG_filter(image, kernel_size, sigma, k_sigma, gamma)
dog /= dog.max()
e = 1 + np.tanh(phi * (dog - epsilon))
e[e >= 1] = 1
return (e * 255).astype('uint8')
def binarize_image(image):
_, binarized = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
return binarized
def skeletonize_and_dilate_image(image):
inverted = cv2.bitwise_not(image)
skeleton = cv2.ximgproc.thinning(inverted, thinningType=cv2.ximgproc.THINNING_ZHANGSUEN)
return cv2.bitwise_not(skeleton)
def process_XDoG(input_dir, output_dir, kernel_size=0, sigma=1.4, k_sigma=1.6, epsilon=0, phi=10, gamma=0.98):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for filename in os.listdir(input_dir):
if filename.lower().endswith((".jpg", ".jpeg", ".png", "webp")):
image_path = os.path.join(input_dir, filename)
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
if image is None:
print(f"Failed to load {filename}")
continue
xdog_image = XDoG_filter(image, kernel_size, sigma, k_sigma, epsilon, phi, gamma)
binarized_image = binarize_image(xdog_image)
final_image = skeletonize_and_dilate_image(binarized_image)
# Invert black and white colors
final_image = 255 - final_image
output_path = os.path.join(output_dir, os.path.splitext(filename)[0] + '.webp')
cv2.imwrite(output_path, final_image)
print(f"Processed {filename} and saved as {output_path}")
if __name__ == '__main__':
input_dir = "E:/desktop/part_b_c/partc"
output_dir = "E:/desktop/part_c_x"
process_XDoG(input_dir, output_dir)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment