Spaces:
Sleeping
Sleeping
import cv2 | |
import numpy as np | |
import os | |
# Load Haar Cascades for face and object detection | |
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') | |
car_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_car.xml') | |
# Helper function to convert PIL to OpenCV | |
def pil_to_cv2(image): | |
return cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR) | |
# Helper function to convert OpenCV to PIL | |
def cv2_to_pil(image): | |
return cv2.cvtColor(image, cv2.COLOR_BGR2RGB) | |
# 1. Image and Video I/O | |
def image_video_io(image=None, video=None): | |
outputs = [] | |
if image is not None: | |
img = pil_to_cv2(image) | |
outputs.append(cv2_to_pil(img)) | |
if video is not None: | |
cap = cv2.VideoCapture(video) | |
ret, frame = cap.read() | |
if ret: | |
outputs.append(cv2_to_pil(frame)) | |
cap.release() | |
return outputs | |
# 2. Color Space Conversion | |
def color_space_conversion(image, color_space): | |
img = pil_to_cv2(image) | |
if color_space == "HSV": | |
output = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) | |
elif color_space == "LAB": | |
output = cv2.cvtColor(img, cv2.COLOR_BGR2LAB) | |
else: | |
output = img | |
return cv2_to_pil(output) | |
# 3. Image Resizing and Cropping | |
def resize_crop(image, scale, crop_x, crop_y, crop_w, crop_h): | |
img = pil_to_cv2(image) | |
h, w = img.shape[:2] | |
new_w, new_h = int(w * scale), int(h * scale) | |
resized = cv2.resize(img, (new_w, new_h)) | |
crop_x, crop_y, crop_w, crop_h = int(crop_x * w), int(crop_y * h), int(crop_w * w), int(crop_h * h) | |
cropped = img[crop_y:crop_y+crop_h, crop_x:crop_x+crop_w] | |
return [cv2_to_pil(resized), cv2_to_pil(cropped)] | |
# 4. Geometric Transformations | |
def geometric_transform(image, angle, tx, ty): | |
img = pil_to_cv2(image) | |
h, w = img.shape[:2] | |
center = (w // 2, h // 2) | |
M = cv2.getRotationMatrix2D(center, angle, 1.0) | |
M[:, 2] += [tx, ty] | |
transformed = cv2.warpAffine(img, M, (w, h)) | |
return cv2_to_pil(transformed) | |
# 5. Image Thresholding | |
def thresholding(image, thresh_type, thresh_value, block_size, C): | |
img = pil_to_cv2(image) | |
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
if thresh_type == "Global": | |
_, thresh = cv2.threshold(gray, thresh_value, 255, cv2.THRESH_BINARY) | |
else: | |
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, block_size, C) | |
return cv2_to_pil(thresh) | |
# 6. Edge Detection | |
def edge_detection(image, edge_type, canny_t1, canny_t2): | |
img = pil_to_cv2(image) | |
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
if edge_type == "Canny": | |
edges = cv2.Canny(gray, canny_t1, canny_t2) | |
elif edge_type == "Sobel": | |
sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=5) | |
sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=5) | |
edges = cv2.magnitude(sobelx, sobely).astype(np.uint8) | |
else: # Laplacian | |
edges = cv2.Laplacian(gray, cv2.CV_64F).astype(np.uint8) | |
return cv2_to_pil(edges) | |
# 7. Image Filtering | |
def image_filtering(image, filter_type, kernel_size): | |
img = pil_to_cv2(image) | |
kernel_size = int(kernel_size) | 1 | |
if filter_type == "Gaussian": | |
filtered = cv2.GaussianBlur(img, (kernel_size, kernel_size), 0) | |
else: # Median | |
filtered = cv2.medianBlur(img, kernel_size) | |
return cv2_to_pil(filtered) | |
# 8. Contour Detection | |
def contour_detection(image): | |
img = pil_to_cv2(image) | |
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) | |
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) | |
output = img.copy() | |
cv2.drawContours(output, contours, -1, (0, 255, 0), 2) | |
return cv2_to_pil(output) | |
# 9. Feature Detection (ORB) | |
def feature_detection(image): | |
img = pil_to_cv2(image) | |
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
orb = cv2.ORB_create() | |
keypoints, _ = orb.detectAndCompute(gray, None) | |
output = cv2.drawKeypoints(img, keypoints, None, color=(0, 255, 0), flags=0) | |
return cv2_to_pil(output) | |
# 10. Object Detection (Haar Cascade for cars) | |
def object_detection(image): | |
img = pil_to_cv2(image) | |
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
cars = car_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) | |
output = img.copy() | |
for (x, y, w, h) in cars: | |
cv2.rectangle(output, (x, y), (x+w, y+h), (0, 255, 0), 2) | |
return cv2_to_pil(output) | |
# 11. Face Detection | |
def face_detection(image): | |
img = pil_to_cv2(image) | |
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) | |
output = img.copy() | |
for (x, y, w, h) in faces: | |
cv2.rectangle(output, (x, y), (x+w, y+h), (0, 255, 0), 2) | |
return cv2_to_pil(output) | |
# 12. Image Segmentation (GrabCut) | |
def image_segmentation(image): | |
img = pil_to_cv2(image) | |
mask = np.zeros(img.shape[:2], np.uint8) | |
bgdModel = np.zeros((1, 65), np.float64) | |
fgdModel = np.zeros((1, 65), np.float64) | |
rect = (50, 50, img.shape[1]-50, img.shape[0]-50) | |
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT) | |
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8') | |
output = img * mask2[:, :, np.newaxis] | |
return cv2_to_pil(output) | |
# 13. Motion Analysis (Optical Flow) | |
def optical_flow(video): | |
cap = cv2.VideoCapture(video) | |
ret, frame1 = cap.read() | |
if not ret: | |
cap.release() | |
return None | |
prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY) | |
hsv = np.zeros_like(frame1) | |
hsv[..., 1] = 255 | |
ret, frame2 = cap.read() | |
if not ret: | |
cap.release() | |
return cv2_to_pil(frame1) | |
next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY) | |
flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0) | |
mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1]) | |
hsv[..., 0] = ang * 180 / np.pi / 2 | |
hsv[..., 2] = cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX) | |
output = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR) | |
cap.release() | |
return cv2_to_pil(output) | |
# 14. Camera Calibration (Simplified) | |
def camera_calibration(image): | |
img = pil_to_cv2(image) | |
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
chessboard_size = (9, 6) | |
ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None) | |
output = img.copy() | |
if ret: | |
cv2.drawChessboardCorners(output, chessboard_size, corners, ret) | |
return cv2_to_pil(output) | |
# 15. Stereo Vision (Simplified Disparity Map) | |
def stereo_vision(image): | |
img = pil_to_cv2(image) | |
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15) | |
disparity = stereo.compute(gray, gray) # Simplified: using same image | |
disparity = cv2.normalize(disparity, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8) | |
return cv2_to_pil(disparity) | |
# 16. Background Subtraction | |
def background_subtraction(video): | |
cap = cv2.VideoCapture(video) | |
fgbg = cv2.createBackgroundSubtractorMOG2() | |
ret, frame = cap.read() | |
if not ret: | |
cap.release() | |
return None | |
fgmask = fgbg.apply(frame) | |
output = cv2.cvtColor(fgmask, cv2.COLOR_GRAY2BGR) | |
cap.release() | |
return cv2_to_pil(output) | |
# 17. Image Stitching | |
def image_stitching(image1, image2): | |
img1 = pil_to_cv2(image1) | |
img2 = pil_to_cv2(image2) | |
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) | |
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) | |
orb = cv2.ORB_create() | |
kp1, des1 = orb.detectAndCompute(gray1, None) | |
kp2, des2 = orb.detectAndCompute(gray2, None) | |
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) | |
matches = bf.match(des1, des2) | |
matches = sorted(matches, key=lambda x: x.distance) | |
good_matches = matches[:10] | |
src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2) | |
dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2) | |
M, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) | |
h, w = img1.shape[:2] | |
result = cv2.warpPerspective(img2, M, (w * 2, h)) | |
result[0:h, 0:w] = img1 | |
return cv2_to_pil(result) | |
# 18. Machine Learning (K-Means) | |
def kmeans_clustering(image, k): | |
img = pil_to_cv2(image) | |
Z = img.reshape((-1, 3)) | |
Z = np.float32(Z) | |
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) | |
_, label, center = cv2.kmeans(Z, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS) | |
center = np.uint8(center) | |
res = center[label.flatten()] | |
output = res.reshape(img.shape) | |
return cv2_to_pil(output) | |
# 19. Deep Learning (MobileNet SSD) | |
def deep_learning(image, prototxt_file, model_file): | |
if prototxt_file is None or model_file is None: | |
return None # Model files must be uploaded | |
img = pil_to_cv2(image) | |
net = cv2.dnn.readNetFromCaffe(prototxt_file.file.name, model_file.file.name) | |
blob = cv2.dnn.blobFromImage(cv2.resize(img, (300, 300)), 0.007843, (300, 300), 127.5) | |
net.setInput(blob) | |
detections = net.forward() | |
output = img.copy() | |
for i in range(detections.shape[2]): | |
confidence = detections[0, 0, i, 2] | |
if confidence > 0.5: | |
box = detections[0, 0, i, 3:7] * np.array([img.shape[1], img.shape[0], img.shape[1], img.shape[0]]) | |
(startX, startY, endX, endY) = box.astype("int") | |
cv2.rectangle(output, (startX, startY), (endX, endY), (0, 255, 0), 2) | |
return cv2_to_pil(output) | |
# 20. Drawing and Text | |
def drawing_text(image, shape, text): | |
img = pil_to_cv2(image) | |
output = img.copy() | |
h, w = img.shape[:2] | |
if shape == "Rectangle": | |
cv2.rectangle(output, (50, 50), (w-50, h-50), (0, 255, 0), 2) | |
elif shape == "Circle": | |
cv2.circle(output, (w//2, h//2), 50, (0, 255, 0), 2) | |
cv2.putText(output, text, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2) | |
return cv2_to_pil(output) |