92 lines
3.7 KiB
Python
92 lines
3.7 KiB
Python
import os
|
|
import cv2
|
|
import numpy as np
|
|
import pandas as pd
|
|
from skimage.feature import graycomatrix, graycoprops
|
|
|
|
def extract_rgb_features(image):
|
|
"""Ekstraksi fitur warna RGB"""
|
|
mean_r = np.mean(image[:, :, 2])
|
|
mean_g = np.mean(image[:, :, 1])
|
|
mean_b = np.mean(image[:, :, 0])
|
|
return mean_r, mean_g, mean_b
|
|
|
|
def extract_glcm_features(image, distances=[1], angles=[0], levels=256, symmetric=True, normed=True):
|
|
"""Ekstraksi fitur tekstur menggunakan GLCM"""
|
|
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
|
|
glcm = graycomatrix(gray_image, distances, angles, levels=levels, symmetric=symmetric, normed=normed)
|
|
contrast = graycoprops(glcm, 'contrast')[0, 0]
|
|
homogeneity = graycoprops(glcm, 'homogeneity')[0, 0]
|
|
energy = graycoprops(glcm, 'energy')[0, 0]
|
|
correlation = graycoprops(glcm, 'correlation')[0, 0]
|
|
return contrast, homogeneity, energy, correlation
|
|
|
|
def extract_laplacian_features(image):
|
|
"""Ekstraksi fitur tepi menggunakan Laplacian"""
|
|
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
|
|
laplacian = cv2.Laplacian(gray_image, cv2.CV_64F)
|
|
mean_laplacian = np.mean(np.abs(laplacian))
|
|
var_laplacian = np.var(laplacian)
|
|
return mean_laplacian, var_laplacian
|
|
|
|
def process_folder(folder_path, label):
|
|
"""Memproses semua gambar dalam folder tertentu dan mengekstrak fitur"""
|
|
data = []
|
|
file_count = len(os.listdir(folder_path))
|
|
processed_count = 0
|
|
|
|
for filename in os.listdir(folder_path):
|
|
if filename.endswith(('.png', '.jpg', '.jpeg')):
|
|
file_path = os.path.join(folder_path, filename)
|
|
image = cv2.imread(file_path)
|
|
|
|
if image is None:
|
|
print(f"❌ [SKIP] Tidak dapat membaca file: {file_path}")
|
|
continue # Lewati gambar yang tidak bisa dibaca
|
|
|
|
try:
|
|
rgb_features = extract_rgb_features(image)
|
|
glcm_features = extract_glcm_features(image)
|
|
laplacian_features = extract_laplacian_features(image)
|
|
|
|
features = rgb_features + glcm_features + laplacian_features + (label,)
|
|
data.append(features)
|
|
|
|
processed_count += 1
|
|
print(f"✅ [{processed_count}/{file_count}] Berhasil diproses: {filename}")
|
|
except Exception as e:
|
|
print(f"❌ [ERROR] Gagal memproses {filename}: {e}")
|
|
|
|
return data
|
|
|
|
def main(folder1, folder2, output_excel, output_csv):
|
|
"""Fungsi utama untuk ekstraksi fitur dari dua folder gambar"""
|
|
columns = ['Mean_R', 'Mean_G', 'Mean_B', 'Contrast', 'Homogeneity', 'Energy', 'Correlation', 'Mean_Laplacian', 'Var_Laplacian', 'Label']
|
|
|
|
print("\n📂 Memproses folder Fresh Strawberry...")
|
|
data1 = process_folder(folder1, 2) # Label 2 untuk Fresh Strawberry
|
|
|
|
print("\n📂 Memproses folder Rotten Strawberry...")
|
|
data2 = process_folder(folder2, 1) # Label 1 untuk Rotten Strawberry
|
|
|
|
# Gabungkan kedua dataset
|
|
all_data = data1 + data2
|
|
|
|
# Konversi ke DataFrame
|
|
df = pd.DataFrame(all_data, columns=columns)
|
|
|
|
# Simpan ke file Excel dan CSV
|
|
df.to_excel(output_excel, index=False)
|
|
df.to_csv(output_csv, index=False)
|
|
|
|
print(f"\n✅ Data telah disimpan ke: {output_excel} dan {output_csv}")
|
|
|
|
if __name__ == "__main__":
|
|
# Ganti dengan path folder yang sesuai
|
|
folder1 = r'C:\Users\user\Documents\dataset_stroberi\Stroberi_segar_BG_grayscale' # Fresh Strawberry
|
|
folder2 = r'C:\Users\user\Documents\dataset_stroberi\Stroberi_busuk_BG_grayscale' # Rotten Strawberry
|
|
output_excel = 'ekstraksi_citra_strawberry.xlsx' # Nama file output Excel
|
|
output_csv = 'ekstraksi_citra_strawberry.csv' # Nama file output CSV
|
|
|
|
main(folder1, folder2, output_excel, output_csv)
|