From ac26e0f97b4fba0e3159d18e19f724cc5d737dcc Mon Sep 17 00:00:00 2001
From: Mohammad Khaleeliyeh <mohammad.khaleeliyeh@asinco.de>
Date: Fri, 12 May 2023 14:31:49 +0200
Subject: [PATCH] stabiles Verhalten

---
 filter_images_V1.py |   9 ++-
 filter_images_V2.py |  20 ++++-
 filter_images_V3.py |   6 +-
 filter_images_V4.py | 178 +++++++++++++++++++++++++++++++++++++++++++
 filter_images_V5.py | 181 ++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 383 insertions(+), 11 deletions(-)
 create mode 100644 filter_images_V4.py
 create mode 100644 filter_images_V5.py

diff --git a/filter_images_V1.py b/filter_images_V1.py
index 1be6379..a296968 100644
--- a/filter_images_V1.py
+++ b/filter_images_V1.py
@@ -69,15 +69,15 @@ def filter_image(image):
     image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
 
     # Minimum filter: Rauschen entfernen
-<<<<<<< HEAD
+
     # Closing operation elliptical shaped kernels
     kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))                        # use another kernal shapes 
     # perform erosion on the image
     image = cv2.erode(image, kernel)
-=======
+
     kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
     #image = cv2.erode(image, kernel)
->>>>>>> 15c1ee4b8b800ce409ac06c9128e25df62715fd1
+
 
     points = find_points(image)
     overlay = np.zeros((image.shape[0], image.shape[1], 3), np.uint8)
@@ -168,7 +168,8 @@ while capture.isOpened():
             #function_img=calculate_function(overlay,result)
 
             cv2.imshow(window, image)
-
+            cv2.imshow('Rsult', result)
+            
         last = filter
     
         code = cv2.waitKey(33)
diff --git a/filter_images_V2.py b/filter_images_V2.py
index a6c6f8b..978004f 100644
--- a/filter_images_V2.py
+++ b/filter_images_V2.py
@@ -28,7 +28,18 @@ def overlay_imgs(base, top):
     img2_fg = cv2.bitwise_and(top,top,mask = mask)
 
     return cv2.add(img1_bg, img2_fg)
-
+def find_points(image):
+    indices = np.where(image > 0)
+    if (indices[1].size > 0):
+        x_sort = np.sort(indices[1])
+        p = np.polyfit(indices[1], indices[0], 4)
+        x = np.arange(x_sort[0], x_sort[-1], 1)
+        y = np.polyval(p, x)
+
+        points = np.column_stack((x, y)).astype(np.int32)
+        return points
+       
+    return None
 def filter_image(image):
     global min_threshold, max_threshold, line_threshold, result, window
     image = image.copy()
@@ -40,9 +51,9 @@ def filter_image(image):
     image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
 
     #lines = cv2.HoughLinesP(image, cv2.HOUGH_PROBABILISTIC, np.pi/360, line_threshold, minLineLength=10, maxLineGap=20)
-
+    points = find_points(image)
     overlay = np.zeros((image.shape[0], image.shape[1], 3), np.uint8)
-
+    cv2.polylines(overlay, [points], False, (255, 0, 0), thickness=2)
     #if lines is not None:
     #    for line in lines:
     #        x1,y1,x2,y2 = line[0]
@@ -102,7 +113,8 @@ while capture.isOpened():
             result = overlay_imgs(frame, overlay)
 
             cv2.imshow(window, image)
-
+            cv2.imshow('overlay', overlay)
+            cv2.imshow('result', result)
     
         code = cv2.waitKey(33)
         if code & 0xFF == ord('s'):
diff --git a/filter_images_V3.py b/filter_images_V3.py
index f1a25c3..4d8fa97 100644
--- a/filter_images_V3.py
+++ b/filter_images_V3.py
@@ -93,7 +93,7 @@ def filter_image(image):
     cv2.polylines(overlay, [points], False, (255, 0, 0), thickness=7)
 
 
-    return overlay
+    return overlay, image
 
 def sharpenImg(image):
     # median of all the pixels under the kernel area
@@ -149,12 +149,12 @@ while capture.isOpened():
         
         if last is not None:
             diff = cv2.absdiff(filter, last) # Difference
-            overlay = filter_image(diff)
+            overlay, image = filter_image(diff)
 
             result = overlay_imgs(frame, overlay)
             
             #function_img=calculate_function(overlay,result)
-
+          #  cv2.imshow(window, image)
             cv2.imshow(window, result)
 
         last = filter
diff --git a/filter_images_V4.py b/filter_images_V4.py
new file mode 100644
index 0000000..f697431
--- /dev/null
+++ b/filter_images_V4.py
@@ -0,0 +1,178 @@
+import cv2
+import numpy as np
+import matplotlib.pyplot as plt
+import time
+from datetime import datetime
+import pandas as pd
+
+VIDEO = 'Videomaterial/WIN_20230414_13_41_55_Pro.mp4'
+capture = cv2.VideoCapture(VIDEO)
+
+
+last = None
+frame = None
+diff = None
+window = 'Filter'
+
+# Einstellungen
+min_threshold  = 30
+max_threshold  = 110
+img_threshold  = 100
+line_threshold = 30
+
+spanne = 2
+
+def overlay_imgs(base, top):
+    topgray = cv2.cvtColor(top, cv2.COLOR_RGB2GRAY)
+
+    _, mask = cv2.threshold(topgray, 10, 255, cv2.THRESH_BINARY)
+    mask_inv = cv2.bitwise_not(mask)
+    # Now black-out the area of overlay
+    img1_bg = cv2.bitwise_and(base,base,mask = mask_inv)
+    # Take only region of from logo image.
+    img2_fg = cv2.bitwise_and(top,top,mask = mask)
+
+    return cv2.add(img1_bg, img2_fg)
+            
+
+def plot_points(x, y, px, py):
+    fig = plt.figure()
+    ax = fig.add_subplot()
+    ax.scatter(px, py, c='r')
+    ax.plot(x, y)
+    ax.set_xlim([0, 1280])
+    ax.set_ylim([720, 0])
+    plt.show()
+
+def find_points(image):
+    indices = np.where(image > 0)
+    if (indices[1].size > 0):
+        x_so = indices[1]
+        y_so = indices[0]
+        
+        list_xy = np.column_stack((x_so, y_so)).astype(np.int32)
+        # list_xy = np.sort(list_xy, axis=0)
+        # print( list_xy)
+        
+        df = pd.DataFrame(list_xy,columns=['x','y'])
+
+        df = df.sort_values(by=['x'], ascending=True)
+
+        n_list = []
+        for el in df.x.unique():
+            med = (df.y.where(df.x >= el-spanne).where(el+spanne >= df.x)).median()
+            n_list.append([el,med])
+           
+        
+        n_list = np.array(n_list)
+
+        
+        p = np.polyfit(n_list[:,0], n_list[:,1], 6)
+        x = np.arange(n_list[:,0][0], n_list[:,0][-1], 1)
+        y = np.polyval(p,x)
+        points = np.column_stack((x, y)).astype(np.int32)
+        
+        return points 
+    
+    return None
+    
+
+def filter_image(image):
+    global min_threshold, max_threshold, line_threshold, result, window
+    image = image.copy()
+    
+    
+    # construct a rectangular kernel from the current size /  rect shaped kernel
+    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (1,1)) 
+    
+    # Opening operation
+    image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
+    
+    # perform erosion on the image
+    image = cv2.erode(image, (3,3))
+    
+    # Closing operation / closing small holes
+    # image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, (1,1))
+    image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, (5,5))
+  #  # image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, (4,4))
+ 
+     
+    # dilation
+    kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2,2))
+    image = cv2.dilate(image,kernel2,iterations = 1)
+    
+    
+   
+    
+    # Use canny edge detection
+    image = cv2.Canny(image, min_threshold, max_threshold)
+    
+    points = find_points(image)
+    overlay = np.zeros((image.shape[0], image.shape[1], 3), np.uint8)
+    # draw a polygon on the image
+    cv2.polylines(overlay, [points], False, (255, 0, 0), thickness=6)
+
+    return overlay, image
+
+def sharpenImg(image):
+    # median of all the pixels under the kernel area
+    blur = cv2.medianBlur(image, 7)
+    # adding tow images 
+    sharp = cv2.addWeighted(image, 1.5, blur, -0.5, 0.0)
+    return sharp
+
+
+
+def line_callback(val):
+    global line_threshold, frame, diff
+
+    line_threshold = val
+    if diff is not None:
+        overlay = filter_image(diff)
+
+        result = overlay_imgs(frame, overlay)
+        cv2.imshow(window, result)
+
+
+# To control the Size of the Disply 
+cv2.namedWindow(window, cv2.WINDOW_AUTOSIZE)
+cv2.createTrackbar('Line Threshold: ', window, line_threshold, 100, line_callback)
+
+result = None
+while capture.isOpened():
+    # ret is the stat of the reading
+    ret, frame = capture.read()
+    if ret == True:
+        frame = cv2.resize(frame, (1280, 720))
+
+       # filter = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)        
+        filter = sharpenImg(frame)
+        
+        if last is not None:
+            diff = cv2.absdiff(filter, last) # Difference
+            cv2.imshow("diff", diff)
+            overlay, image = filter_image(diff)
+
+            result = overlay_imgs(frame, overlay)
+            
+
+            cv2.imshow("image", image)
+            cv2.imshow("result", result)
+         #   time.sleep(0.1)
+        last = filter
+    
+        code = cv2.waitKey(10)
+        if code & 0xFF == ord('s'):
+            now = datetime.now()
+            str = now.strftime("%d_%m_%Y_%H_%M_%S")
+            cv2.imwrite(f'Filter/IMG_{str}.png', result)
+
+        if code & 0xFF == ord('q'):
+            break
+
+    else:
+        break
+
+capture.release()
+
+cv2.destroyAllWindows()
\ No newline at end of file
diff --git a/filter_images_V5.py b/filter_images_V5.py
new file mode 100644
index 0000000..798d80d
--- /dev/null
+++ b/filter_images_V5.py
@@ -0,0 +1,181 @@
+import cv2
+import numpy as np
+import matplotlib.pyplot as plt
+import time
+from datetime import datetime
+import pandas as pd
+
+VIDEO = 'Videomaterial/WIN_20230414_13_41_55_Pro.mp4'
+capture = cv2.VideoCapture(VIDEO)
+
+
+last = None
+frame = None
+diff = None
+window = 'Filter'
+
+# Einstellungen
+min_threshold  = 30
+max_threshold  = 110
+img_threshold  = 100
+line_threshold = 30
+
+spanne = 2
+
+def overlay_imgs(base, top):
+    topgray = cv2.cvtColor(top, cv2.COLOR_RGB2GRAY)
+
+    _, mask = cv2.threshold(topgray, 10, 255, cv2.THRESH_BINARY)
+    mask_inv = cv2.bitwise_not(mask)
+    # Now black-out the area of overlay
+    img1_bg = cv2.bitwise_and(base,base,mask = mask_inv)
+    # Take only region of from logo image.
+    img2_fg = cv2.bitwise_and(top,top,mask = mask)
+
+    return cv2.add(img1_bg, img2_fg)
+            
+
+def plot_points(x, y, px, py):
+    fig = plt.figure()
+    ax = fig.add_subplot()
+    ax.scatter(px, py, c='r')
+    ax.plot(x, y)
+    ax.set_xlim([0, 1280])
+    ax.set_ylim([720, 0])
+    plt.show()
+
+def find_points(image):
+    indices = np.where(image > 0)
+    if (indices[1].size > 0):
+        x_so = indices[1]
+        y_so = indices[0]
+        
+        list_xy = np.column_stack((x_so, y_so)).astype(np.int32)
+        # list_xy = np.sort(list_xy, axis=0)
+        # print( list_xy)
+        
+        df = pd.DataFrame(list_xy,columns=['x','y'])
+
+        df = df.sort_values(by=['x'], ascending=True)
+
+        n_list = []
+        
+        df_un = df.x.unique()                    
+        for el in df_un[::2]:
+            
+            med = (df.y.where(df.x >= el-spanne).where(el+spanne >= df.x)).median()
+            n_list.append([el,med])
+          
+        
+        n_list = np.array(n_list)
+
+        
+        p = np.polyfit(n_list[:,0], n_list[:,1], 6)
+        x = np.arange(n_list[:,0][0], n_list[:,0][-1], 1)
+        y = np.polyval(p,x)
+        points = np.column_stack((x, y)).astype(np.int32)
+        
+        return points 
+    
+    return None
+    
+
+def filter_image(image):
+    global min_threshold, max_threshold, line_threshold, result, window
+    image = image.copy()
+    
+    
+    # construct a rectangular kernel from the current size /  rect shaped kernel
+    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (1,1)) 
+    
+    # Opening operation
+    image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
+    
+    # perform erosion on the image
+    image = cv2.erode(image, (3,3))
+    
+    # Closing operation / closing small holes
+    # image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, (1,1))
+    image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, (5,5))
+  #  # image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, (4,4))
+ 
+     
+    # dilation
+    kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2,2))
+    image = cv2.dilate(image,kernel2,iterations = 1)
+    
+    
+   
+    
+    # Use canny edge detection
+    image = cv2.Canny(image, min_threshold, max_threshold)
+    
+    points = find_points(image)
+    overlay = np.zeros((image.shape[0], image.shape[1], 3), np.uint8)
+    # draw a polygon on the image
+    cv2.polylines(overlay, [points], False, (255, 0, 0), thickness=6)
+
+    return overlay, image
+
+def sharpenImg(image):
+    # median of all the pixels under the kernel area
+    blur = cv2.medianBlur(image, 7)
+    # adding tow images 
+    sharp = cv2.addWeighted(image, 1.5, blur, -0.5, 0.0)
+    return sharp
+
+
+
+def line_callback(val):
+    global line_threshold, frame, diff
+
+    line_threshold = val
+    if diff is not None:
+        overlay = filter_image(diff)
+
+        result = overlay_imgs(frame, overlay)
+        cv2.imshow(window, result)
+
+
+# To control the Size of the Disply 
+cv2.namedWindow(window, cv2.WINDOW_AUTOSIZE)
+cv2.createTrackbar('Line Threshold: ', window, line_threshold, 100, line_callback)
+
+result = None
+while capture.isOpened():
+    # ret is the stat of the reading
+    ret, frame = capture.read()
+    if ret == True:
+        frame = cv2.resize(frame, (1280, 720))
+
+       # filter = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)        
+        filter = sharpenImg(frame)
+        
+        if last is not None:
+            diff = cv2.absdiff(filter, last) # Difference
+            cv2.imshow("diff", diff)
+            overlay, image = filter_image(diff)
+
+            result = overlay_imgs(frame, overlay)
+            
+
+            cv2.imshow("image", image)
+            cv2.imshow("result", result)
+         #   time.sleep(0.1)
+        last = filter
+    
+        code = cv2.waitKey(10)
+        if code & 0xFF == ord('s'):
+            now = datetime.now()
+            str = now.strftime("%d_%m_%Y_%H_%M_%S")
+            cv2.imwrite(f'Filter/IMG_{str}.png', result)
+
+        if code & 0xFF == ord('q'):
+            break
+
+    else:
+        break
+
+capture.release()
+
+cv2.destroyAllWindows()
\ No newline at end of file
-- 
GitLab