import cv2 import numpy as np import matplotlib.pyplot as plt import scipy.ndimage as sc # --- 1. Citire si dimensiuni --- img = cv2.imread('img1.jpg') print(f"Dimensiuni: {img.shape}") if len(img.shape) == 3: print("Tip imagine: Color (BGR)") else: print("Tip imagine: Grayscale") # --- 2. Planul Rosu colorat in Cyan --- # In OpenCV canalele sunt B-G-R. Rosu este indexul 2. # Cyan = Albastru + Verde. red_channel = img[:, :, 2] img_cyan = np.zeros_like(img) img_cyan[:, :, 0] = red_channel # Canalul Blue primeste intensitatea de pe Red img_cyan[:, :, 1] = red_channel # Canalul Green primeste intensitatea de pe Red # Canalul Red (2) ramane 0. # --- 3. Transformare si Contrast (CLAHE) --- # [cite_start]Se foloseste CLAHE pentru evidentierea detaliilor locale (tumora) [cite: 36] gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) img_clahe = clahe.apply(gray) # --- 4. Binarizare (Otsu) --- # [cite_start]Extragerea tumorii folosind pragul Otsu [cite: 40] ret, thresh = cv2.threshold(img_clahe, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) print(f"Pragul Otsu ales automat: {ret}") # --- 5. Operatie Morfologica (Deschidere/Opening) --- # [cite_start]Eliminare componente conexe mici fara a deteriora obiectul [cite: 71] structura = np.ones((5, 5)) mask_clean = sc.binary_opening(thresh, structure=structura).astype(np.uint8) * 255 # --- Afisare --- plt.figure(figsize=(12, 6)) plt.subplot(1, 3, 1); plt.imshow(cv2.cvtColor(img_cyan, cv2.COLOR_BGR2RGB)); plt.title('Plan Rosu -> Cyan') plt.subplot(1, 3, 2); plt.imshow(img_clahe, cmap='gray'); plt.title('Contrast Imbunatatit (CLAHE)') plt.subplot(1, 3, 3); plt.imshow(mask_clean, cmap='gray'); plt.title('Segmentare Finala (Tumora)') plt.show() import cv2 import numpy as np import scipy.ndimage as sc import matplotlib.pyplot as plt img2 = cv2.imread('img2.jpg', 0) # --- 1 & 2. Identificare si eliminare zgomot --- # [cite_start]Daca zgomotul este Sare & Piper (impulsiv), se foloseste filtrul Median [cite: 69] # Daca zgomotul este Gaussian, se poate folosi un filtru de mediere sau Gaussian. # Presupunem filtru Median conform cerintelor uzuale de eliminare zgomot impulsiv: img_filtered = sc.median_filter(img2, size=3, mode='nearest') # --- 3. Imbunatatire contrast --- # [cite_start]Egalizare histograma [cite: 35] img_eq = cv2.equalizeHist(img_filtered) # --- 4. Segmentare (Otsu) --- # [cite_start]Binarizare pentru obtinerea obiectului [cite: 40] ret2, mask2 = cv2.threshold(img_eq, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # --- 5. Extragere Zona de Interes (ROI) --- # Aplicarea mastii peste imaginea filtrata roi = cv2.bitwise_and(img_filtered, img_filtered, mask=mask2) # --- Afisare --- plt.figure(figsize=(12, 4)) plt.subplot(1, 4, 1); plt.imshow(img2, cmap='gray'); plt.title('Imagine Zgomotoasa') plt.subplot(1, 4, 2); plt.imshow(img_filtered, cmap='gray'); plt.title('Filtrata (Median)') plt.subplot(1, 4, 3); plt.imshow(mask2, cmap='gray'); plt.title('Masca (Otsu)') plt.subplot(1, 4, 4); plt.imshow(roi, cmap='gray'); plt.title('Zona de Interes') plt.show() import cv2 import numpy as np import matplotlib.pyplot as plt from skimage import measure img3 = cv2.imread('img3.jpg', 0) # --- 1. Extragere Contur (Canny) --- # [cite_start]Operatorul Canny pentru contururi [cite: 69] edges = cv2.Canny(img3, 100, 200) # --- 2. Pregatire pentru Arie si Perimetru --- # Pentru a calcula aria, avem nevoie de regiuni pline, nu doar contururi. # Aplicam binarizare si etichetare. ret3, thresh3 = cv2.threshold(img3, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) [cite_start]labels = measure.label(thresh3) # Etichetare regiuni [cite: 74] # [cite_start]Extragere proprietati [cite: 75] props = measure.regionprops(labels, img3) # [cite_start]Selectarea celulei albe (presupunem ca este regiunea cu aria cea mai mare) [cite: 32, 34] celula = max(props, key=lambda r: r.area) # --- 3. Afisare Arie si Perimetru --- print(f"Aria celulei: {celula.area}") print(f"Perimetrul celulei: {celula.perimeter}") # --- Afisare --- plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1); plt.imshow(edges, cmap='gray'); plt.title('Contur (Canny)') plt.subplot(1, 2, 2); plt.imshow(thresh3, cmap='gray'); plt.title('Regiune identificata') plt.show()