File size: 2,407 Bytes
e06826c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import streamlit as st
import os
import cv2
import numpy as np
from PIL import Image
import image_processing
import matplotlib.pyplot as plt

st.set_page_config(page_title="Soil Image Processor", layout="wide")

# Convert PIL image to numpy
def np_image(pil_img):
    return np.array(pil_img.convert("RGB"))

# UI layout
st.title("๐Ÿงช Soil Image Processor")

st.subheader("๐Ÿ“Š Image Analysis & Prediction")
uploaded_file = st.file_uploader("Upload an image for prediction", type=["png", "jpg", "jpeg"])

if uploaded_file:
    pil_img = Image.open(uploaded_file)
    img_array = np_image(pil_img)

    # Step 1: Show original image
    st.image(pil_img, caption="Uploaded Image", use_container_width=True)

    # Step 2: RGB Histogram
    hist_fig = image_processing.plot_rgb_histogram(img_array)
    st.pyplot(hist_fig)

    # Step 3: Preprocessing
    rgb_img, clahe_img, sharp_img = image_processing.preprocessing(cv2.cvtColor(img_array, cv2.COLOR_BGR2RGB))
    st.image([rgb_img, clahe_img, sharp_img], caption=["RGB Image", "CLAHE Image", "Sharpened Image"], width=250)

    # Step 4: Choose mode: Whole image vs Region-based
    st.markdown("### ๐Ÿ” Classification Mode")
    use_segmentation = st.checkbox("Enable multi-region (segmented) classification")

    if use_segmentation:
        k = st.slider("Select number of regions (clusters)", min_value=2, max_value=5)
        segmented_image, region_predictions = image_processing.segment_and_classify_regions(img_array, k_clusters=k)

        st.image(cv2.cvtColor(segmented_image, cv2.COLOR_BGR2RGB), caption="Segmented & Classified", use_column_width=True)

        st.markdown("### ๐Ÿงฉ Region-wise Predictions")
        for idx, region in enumerate(region_predictions):
            st.write(f"**Region {idx + 1}:** `{region['class']}` with confidence `{region['confidence']:.2f}`")
            x, y, w, h = region['bbox']
            cropped = img_array[y:y+h, x:x+w]
            st.image(cropped, caption=f"Region {idx + 1}", width=200)

    else:
        # Step 5: Feature Extraction & Prediction on whole image
        features_df, predicted_class, confidence = image_processing.predict_image_class_with_features(cv2.cvtColor(img_array, cv2.COLOR_BGR2RGB))

        st.subheader("๐Ÿ“ˆ Extracted Features")
        st.dataframe(features_df)

        st.success(f"๐Ÿ”ฎ Predicted Class: **{predicted_class}** (Confidence: {confidence:.2f})")