Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -15,7 +15,8 @@ def background_subtraction(image1, image2):
|
|
15 |
fgmask1 = subtractor.apply(image1)
|
16 |
fgmask2 = subtractor.apply(image2)
|
17 |
diff = cv2.absdiff(fgmask1, fgmask2)
|
18 |
-
|
|
|
19 |
|
20 |
def optical_flow(image1, image2):
|
21 |
gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
|
@@ -26,7 +27,8 @@ def optical_flow(image1, image2):
|
|
26 |
hsv[..., 1] = 255
|
27 |
hsv[..., 0] = ang * 180 / np.pi / 2
|
28 |
hsv[..., 2] = cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX)
|
29 |
-
|
|
|
30 |
|
31 |
def feature_matching(image1, image2):
|
32 |
orb = cv2.ORB_create()
|
@@ -36,17 +38,17 @@ def feature_matching(image1, image2):
|
|
36 |
matches = bf.match(des1, des2)
|
37 |
matches = sorted(matches, key=lambda x: x.distance)
|
38 |
result = cv2.drawMatches(image1, kp1, image2, kp2, matches[:20], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
|
39 |
-
|
|
|
40 |
|
41 |
def compare_images(image1, image2, blur_value, technique, threshold_value, method):
|
42 |
if method == "Background Subtraction":
|
43 |
-
return background_subtraction(image1, image2)
|
44 |
elif method == "Optical Flow":
|
45 |
-
return optical_flow(image1, image2)
|
46 |
elif method == "Feature Matching":
|
47 |
-
return feature_matching(image1, image2)
|
48 |
|
49 |
-
# Default SSIM comparison
|
50 |
gray1 = preprocess_image(image1, blur_value)
|
51 |
gray2 = preprocess_image(image2, blur_value)
|
52 |
score, diff = ssim(gray1, gray2, full=True)
|
@@ -70,8 +72,9 @@ def compare_images(image1, image2, blur_value, technique, threshold_value, metho
|
|
70 |
diff_colored[:, :, 1] = 0
|
71 |
diff_colored[:, :, 2] = thresh
|
72 |
overlayed = cv2.addWeighted(image1, 0.7, diff_colored, 0.6, 0)
|
|
|
73 |
|
74 |
-
return highlighted, overlayed
|
75 |
|
76 |
def update_threshold_visibility(technique):
|
77 |
return gr.update(visible=(technique == "Simple Binary"))
|
@@ -83,7 +86,7 @@ with gr.Blocks() as demo:
|
|
83 |
img1 = gr.Image(type="numpy", label="Image Without Object")
|
84 |
img2 = gr.Image(type="numpy", label="Image With Object")
|
85 |
|
86 |
-
blur_slider = gr.Slider(minimum=1, maximum=15, step=
|
87 |
technique_dropdown = gr.Dropdown(["Adaptive Threshold", "Otsu's Threshold", "Simple Binary"], label="Thresholding Technique", value="Adaptive Threshold", interactive=True)
|
88 |
threshold_slider = gr.Slider(minimum=0, maximum=255, step=1, value=50, label="Threshold Value", visible=False)
|
89 |
method_dropdown = gr.Dropdown(["SSIM", "Background Subtraction", "Optical Flow", "Feature Matching"], label="Comparison Method", value="SSIM", interactive=True)
|
@@ -94,7 +97,10 @@ with gr.Blocks() as demo:
|
|
94 |
output1 = gr.Image(type="numpy", label="Highlighted Differences")
|
95 |
output2 = gr.Image(type="numpy", label="Raw Difference Overlay (Magenta)")
|
96 |
|
|
|
|
|
|
|
97 |
btn = gr.Button("Process")
|
98 |
-
btn.click(compare_images, inputs=[img1, img2, blur_slider, technique_dropdown, threshold_slider, method_dropdown], outputs=[output1, output2])
|
99 |
|
100 |
demo.launch()
|
|
|
15 |
fgmask1 = subtractor.apply(image1)
|
16 |
fgmask2 = subtractor.apply(image2)
|
17 |
diff = cv2.absdiff(fgmask1, fgmask2)
|
18 |
+
unchanged = cv2.bitwise_and(image1, image1, mask=255 - diff)
|
19 |
+
return cv2.cvtColor(diff, cv2.COLOR_GRAY2BGR), unchanged
|
20 |
|
21 |
def optical_flow(image1, image2):
|
22 |
gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
|
|
|
27 |
hsv[..., 1] = 255
|
28 |
hsv[..., 0] = ang * 180 / np.pi / 2
|
29 |
hsv[..., 2] = cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX)
|
30 |
+
unchanged = cv2.bitwise_and(image1, image1, mask=255 - hsv[..., 2].astype(np.uint8))
|
31 |
+
return cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR), unchanged
|
32 |
|
33 |
def feature_matching(image1, image2):
|
34 |
orb = cv2.ORB_create()
|
|
|
38 |
matches = bf.match(des1, des2)
|
39 |
matches = sorted(matches, key=lambda x: x.distance)
|
40 |
result = cv2.drawMatches(image1, kp1, image2, kp2, matches[:20], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
|
41 |
+
unchanged = cv2.addWeighted(image1, 0.7, image2, 0.3, 0)
|
42 |
+
return result, unchanged
|
43 |
|
44 |
def compare_images(image1, image2, blur_value, technique, threshold_value, method):
|
45 |
if method == "Background Subtraction":
|
46 |
+
return background_subtraction(image1, image2)
|
47 |
elif method == "Optical Flow":
|
48 |
+
return optical_flow(image1, image2)
|
49 |
elif method == "Feature Matching":
|
50 |
+
return feature_matching(image1, image2)
|
51 |
|
|
|
52 |
gray1 = preprocess_image(image1, blur_value)
|
53 |
gray2 = preprocess_image(image2, blur_value)
|
54 |
score, diff = ssim(gray1, gray2, full=True)
|
|
|
72 |
diff_colored[:, :, 1] = 0
|
73 |
diff_colored[:, :, 2] = thresh
|
74 |
overlayed = cv2.addWeighted(image1, 0.7, diff_colored, 0.6, 0)
|
75 |
+
unchanged = cv2.bitwise_and(image1, image1, mask=255 - thresh)
|
76 |
|
77 |
+
return highlighted, overlayed, unchanged
|
78 |
|
79 |
def update_threshold_visibility(technique):
|
80 |
return gr.update(visible=(technique == "Simple Binary"))
|
|
|
86 |
img1 = gr.Image(type="numpy", label="Image Without Object")
|
87 |
img2 = gr.Image(type="numpy", label="Image With Object")
|
88 |
|
89 |
+
blur_slider = gr.Slider(minimum=1, maximum=15, step=1, value=5, label="Gaussian Blur")
|
90 |
technique_dropdown = gr.Dropdown(["Adaptive Threshold", "Otsu's Threshold", "Simple Binary"], label="Thresholding Technique", value="Adaptive Threshold", interactive=True)
|
91 |
threshold_slider = gr.Slider(minimum=0, maximum=255, step=1, value=50, label="Threshold Value", visible=False)
|
92 |
method_dropdown = gr.Dropdown(["SSIM", "Background Subtraction", "Optical Flow", "Feature Matching"], label="Comparison Method", value="SSIM", interactive=True)
|
|
|
97 |
output1 = gr.Image(type="numpy", label="Highlighted Differences")
|
98 |
output2 = gr.Image(type="numpy", label="Raw Difference Overlay (Magenta)")
|
99 |
|
100 |
+
with gr.Row():
|
101 |
+
output3 = gr.Image(type="numpy", label="Unchanged Areas Blended")
|
102 |
+
|
103 |
btn = gr.Button("Process")
|
104 |
+
btn.click(compare_images, inputs=[img1, img2, blur_slider, technique_dropdown, threshold_slider, method_dropdown], outputs=[output1, output2, output3])
|
105 |
|
106 |
demo.launch()
|