Python’s RGB and HSV slider threshold segmentation tool

Effect image

Operation interface diagram:

RGB code:

from tkinter import *
from tkinter.filedialog import askopenfilename
import cv2
import numpy as np

def selectPath():
    # path_ = askdirectory()
    path_ = askopenfilename()
    path.set(path_)
    print(path_)

    def stackImages(scale, imgArray):
        rows = len(imgArray)
        cols = len(imgArray[0])
        rowsAvailable = isinstance(imgArray[0], list)
        width = imgArray[0][0].shape[1]
        height = imgArray[0][0].shape[0]
        if rowsAvailable:
            for x in range(0, rows):
                for y in range(0, cols):
                    if imgArray[x][y].shape[:2] == imgArray[0][0].shape[:2]:
                        imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)
                    else:
                        imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]),
                                                    None, scale, scale)
                    if len(imgArray[x][y].shape) == 2: imgArray[x][y] = cv2.cvtColor(imgArray[x][y], cv2.COLOR_GRAY2BGR)
            imageBlank = np.zeros((height, width, 3), np.uint8)
            hor = [imageBlank] * rows
            hor_con = [imageBlank] * rows
            for x in range(0, rows):
                hor[x] = np.hstack(imgArray[x])
            ver = np.vstack(hor)
        else:
            for x in range(0, rows):
                if imgArray[x].shape[:2] == imgArray[0].shape[:2]:
                    imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)
                else:
                    imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None, scale,
                                             scale)
                if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)
            hor = np.hstack(imgArray)
            ver = hor
        return ver

    def empty(a):
        pass

    cv2.namedWindow("TrackBars")
    cv2.resizeWindow("TrackBars",680,240)
    cv2.createTrackbar("R", "TrackBars", 0,255, empty)
    cv2.createTrackbar("G", "TrackBars", 0, 255, empty)
    cv2.createTrackbar("B", "TrackBars", 0, 255, empty)

    # The maximum and minimum values on the toolbar
    img = cv2.imdecode(np.fromfile(path_, dtype=np.uint8), 1)
    while True:
        b,g,r=cv2. split(img)
        b1,g1,r1=cv2. split(img)
        b2,g2,r2=cv2. split(img)
        # Get the data value according to the character
        r[:,:] = cv2. getTrackbarPos("R", "TrackBars")
        g1[:,:] = cv2. getTrackbarPos("G", "TrackBars")
        b2[:,:]= cv2. getTrackbarPos("B", "TrackBars")
        cv2.imshow("original", img)
        rgb=cv2. merge((r,g,b))
        cv2.imshow("r_img", rgb)
        rgb_1 = cv2. merge((r1, g1, b1))
        cv2.imshow("g_img", rgb_1)
        rgb_2 = cv2. merge((r2, g2, b2))
        cv2.imshow("b_img", rgb_2)
        k = cv2.waitKey(1)
        if k == ord('q'):
            break
    cv2.destroyAllWindows()
if __name__ == '__main__':
    root = Tk()
    path = StringVar()
    Label(root, text="Image path:").grid(row=0, column=0)
    Entry(root, textvariable=path).grid(row=0, column=1)
    Button(root, text="Open Image", command=selectPath).grid(row=0, column=2)
    Label(root, text="Remarks: Press q to exit image display").grid(row=1, column=0)
    root. mainloop()

HSV code:

from tkinter import *
from tkinter.filedialog import askopenfilename
import cv2
import numpy as np

def selectPath():
    # path_ = askdirectory()
    path_ = askopenfilename()
    path.set(path_)
    print(path_)

    def stackImages(scale, imgArray):
        rows = len(imgArray)
        cols = len(imgArray[0])
        rowsAvailable = isinstance(imgArray[0], list)
        width = imgArray[0][0].shape[1]
        height = imgArray[0][0].shape[0]
        if rowsAvailable:
            for x in range(0, rows):
                for y in range(0, cols):
                    if imgArray[x][y].shape[:2] == imgArray[0][0].shape[:2]:
                        imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)
                    else:
                        imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]),
                                                    None, scale, scale)
                    if len(imgArray[x][y].shape) == 2: imgArray[x][y] = cv2.cvtColor(imgArray[x][y], cv2.COLOR_GRAY2BGR)
            imageBlank = np.zeros((height, width, 3), np.uint8)
            hor = [imageBlank] * rows
            hor_con = [imageBlank] * rows
            for x in range(0, rows):
                hor[x] = np.hstack(imgArray[x])
            ver = np.vstack(hor)
        else:
            for x in range(0, rows):
                if imgArray[x].shape[:2] == imgArray[0].shape[:2]:
                    imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)
                else:
                    imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None, scale,
                                             scale)
                if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)
            hor = np.hstack(imgArray)
            ver = hor
        return ver

    def empty(a):
        pass
    
    cv2.namedWindow("TrackBars")
    cv2.resizeWindow("TrackBars",680,320)
    cv2.createTrackbar("Hue min", "TrackBars", 0, 180, empty)
    cv2.createTrackbar("Hue max", "TrackBars", 50, 180, empty)
    cv2.createTrackbar("Sat min", "TrackBars", 0, 255, empty)
    cv2.createTrackbar("Sat max", "TrackBars", 250, 255, empty)
    cv2. createTrackbar("Val min", "TrackBars", 255, 255, empty)
    cv2. createTrackbar("Val max", "TrackBars", 255, 255, empty)

    # The maximum and minimum values on the toolbar
    img = cv2.imdecode(np.fromfile(path_, dtype=np.uint8), 1)
    while True:
        imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
        # Get the data value according to the character
        h_min = cv2.getTrackbarPos("Hue min", "TrackBars")
        h_max = cv2.getTrackbarPos("Hue max", "TrackBars")
        s_min = cv2.getTrackbarPos("Sat min", "TrackBars")
        s_max = cv2.getTrackbarPos("Sat max", "TrackBars")
        v_min = cv2.getTrackbarPos("Val min", "TrackBars")
        v_max = cv2.getTrackbarPos("Val max", "TrackBars")
        # print(h_min, h_max, s_min, s_max, v_min, v_max)
        lower = np.array([h_min, s_min, v_min])
        upper = np.array([h_max, s_max, v_max])
        mask = cv2.inRange(imgHSV, lower, upper)
        imgResult = cv2. bitwise_and(img, img, mask=mask)
        cv2.imshow("original", img)
        # cv2.imshow("HSV",imgHSV)
        print(mask. shape, lower, upper)
        cv2.imwrite("a.jpg",mask)
        cv2.imshow("Mask", mask)
        k = cv2.waitKey(1)
        if k == ord('q'):
            break
    cv2.destroyAllWindows()
if __name__ == '__main__':
    root = Tk()
    path = StringVar()
    Label(root, text="Image path:").grid(row=0, column=0)
    Entry(root, textvariable=path).grid(row=0, column=1)
    Button(root, text="Open Image", command=selectPath).grid(row=0, column=2)
    Label(root, text="Remarks: Press q to exit image display").grid(row=1, column=0)
    root. mainloop()

Note:

This code is only for personal collection. If there is any infringement, please contact and delete it.