HaruthaiAi's picture
Fix YAML error and finalize README with full Colab instructions
43f15d4 verified
|
raw
history blame
5.22 kB
metadata
title: Ai DeepLearning Treeoilpainting
emoji: πŸ“ˆ
colorFrom: gray
colorTo: gray
sdk: gradio
sdk_version: 5.20.0
app_file: app.py
pinned: false
license: mit
short_description: AI model for brushstroke analysis of Tree Oil Painting

🧠 AI Sunny: 18 Supreme Techniques for Brushstroke Analysis

Google Colab Compatible – Self-run notebook

This section provides a complete Colab code block and instructions for analyzing any uploaded painting image using the Tree Oil Painting method.


βœ… Step-by-step instructions:

πŸ“Œ Step 1 – Download the sample image
Use this sample reference image for testing:
Filename: 99_98_Tree_photo.jpg
Make sure to save or rename your image file with this exact name before uploading into Colab.

⚠️ Important:
When running the code in Google Colab, your code must reference the filename exactly as written.

If you use a different image, change the filename in the code accordingly, or rename your image file.


πŸ§ͺ Full Colab Code Block

# STEP 1: Install dependencies
!pip install opencv-python-headless matplotlib numpy scipy --quiet

# STEP 2: Import libraries
import cv2
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft2, fftshift
from scipy.ndimage import sobel, gaussian_filter

# STEP 3: Upload image
from google.colab import files
uploaded = files.upload()
filename = list(uploaded.keys())[0]

# STEP 4: Load image in grayscale
img = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)
if img is None:
    raise FileNotFoundError("Cannot load image. Please check filename.")

# STEP 5: Define 18 Techniques
def sobel_edge(img): return cv2.Sobel(img, cv2.CV_64F, 1, 0) + cv2.Sobel(img, cv2.CV_64F, 0, 1)
def torque_force(img): return np.full_like(img, 128, dtype=np.uint8)
def stroke_pressure(img): 
    color_img = cv2.imread(filename)
    return cv2.detailEnhance(color_img, sigma_s=10, sigma_r=0.15)
def flick_vector(img): return sobel(img, axis=0) + sobel(img, axis=1)
def fourier_transform(img): return np.log(1 + np.abs(fftshift(fft2(img))))
def gabor_45(img):
    kernel = cv2.getGaborKernel((21, 21), 8.0, np.pi/4, 10.0, 0.5)
    return cv2.filter2D(img, cv2.CV_8UC3, kernel)
def texture_grain(img): return cv2.Laplacian(img, cv2.CV_64F)
def stroke_length_histogram(img):
    edges = cv2.Canny(img, 100, 200)
    stroke_lengths = np.sum(edges > 0, axis=1)
    hist_img = np.zeros_like(img)
    for i, val in enumerate(stroke_lengths): hist_img[i, :val] = 255
    return hist_img
def underdrawing_sim(img): return gaussian_filter(img, sigma=3)
def brush_directionality(img): return sobel(img, axis=0) - sobel(img, axis=1)
def cross_stroke_overlay(img): return cv2.addWeighted(img, 0.5, cv2.GaussianBlur(img, (7,7), 2), 0.5, 0)
def edge_flow_rhythm(img): return cv2.Canny(img, 50, 150)
def zone_sample(img): return img[:img.shape[0]//2, :img.shape[1]//2]
def pigment_flow(img): return cv2.applyColorMap(img, cv2.COLORMAP_JET)
def asymmetry_detection(img): return cv2.absdiff(img, cv2.flip(img, 1))
def directional_energy(img): 
    edges = sobel_edge(img)
    norm = cv2.normalize(edges, None, 0, 255, cv2.NORM_MINMAX)
    return cv2.applyColorMap(norm.astype(np.uint8), cv2.COLORMAP_TWILIGHT)
def vanishing_point_torque(img): 
    mask = np.zeros_like(img)
    cv2.circle(mask, (img.shape[1]//2, img.shape[0]//2), 25, 255, -1)
    return mask
def texture_frequency(img): return fourier_transform(img)

# STEP 6: Apply all techniques
techniques = [
    ("1. Sobel Edge Detection", sobel_edge(img)),
    ("2. Torque Force Approx.", torque_force(img)),
    ("3. Stroke Pressure Mapping", stroke_pressure(img)),
    ("4. Flick Vectorization", flick_vector(img)),
    ("5. Fourier Transform", fourier_transform(img)),
    ("6. Gabor 45Β°", gabor_45(img)),
    ("7. Texture Grain", texture_grain(img)),
    ("8. Stroke Length Histogram", stroke_length_histogram(img)),
    ("9. Underdrawing Simulation", underdrawing_sim(img)),
    ("10. Brush Directionality", brush_directionality(img)),
    ("11. Cross-Stroke Overlay", cross_stroke_overlay(img)),
    ("12. Edge Flow Rhythm", edge_flow_rhythm(img)),
    ("13. Zone Sample (Top-Left)", zone_sample(img)),
    ("14. Pigment Flow Simulation", pigment_flow(img)),
    ("15. Asymmetry Detection", asymmetry_detection(img)),
    ("16. Directional Energy", directional_energy(img)),
    ("17. Vanishing Point Torque", vanishing_point_torque(img)),
    ("18. Texture Frequency Spectrum", texture_frequency(img)),
]

# STEP 7: Display results
fig, axs = plt.subplots(6, 3, figsize=(18, 36))
for i, (title, output) in enumerate(techniques):
    ax = axs[i//3, i%3]
    cmap = 'gray' if len(output.shape) == 2 else None
    ax.imshow(output, cmap=cmap)
    ax.set_title(title)
    ax.axis('off')
plt.tight_layout()
plt.show()

πŸ“Œ Note:
This technique is designed to analyze torque, stroke rhythm, and brush pressure of any oil painting.

❌ Do not use SSIM or pixel-level similarity for final conclusions.
βœ… Use AI natural matching or deep feature comparison to verify authenticity or stylistic similarity.


Now you're ready to analyze Van Gogh–like energy in a Tree Oil painting! 🌳