From 06d9d8239289df5f93a294ce88b1706230e64745 Mon Sep 17 00:00:00 2001 From: raiots Date: Thu, 18 May 2023 22:46:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20hsv=20=E5=8F=AF=E8=A7=86=E5=8C=96?= =?UTF-8?q?=E7=AD=9B=E9=80=89=E5=99=A8=E5=8F=8A=E8=B7=AF=E5=BE=84=E6=A1=86?= =?UTF-8?q?=E9=80=89=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/hsv_pick.py | 159 +++++++++++++++++++++++++++++++++++++++++++ utils/path_detect.py | 37 ++++++++++ 2 files changed, 196 insertions(+) create mode 100644 utils/hsv_pick.py create mode 100644 utils/path_detect.py diff --git a/utils/hsv_pick.py b/utils/hsv_pick.py new file mode 100644 index 0000000..c876c1c --- /dev/null +++ b/utils/hsv_pick.py @@ -0,0 +1,159 @@ +import os +import tkinter as tk +from tkinter import * +from tkinter import filedialog +from PIL import Image, ImageTk + + +os.chdir('D:\Documents\Programing\PycharmProjects\OrionVision\data') + +class GUI(): + def __init__(self, window): + self.window = window + # title + self.window.title("fish fish fish") + # siz=800*600,position=(500,200) + self.window.geometry('1600x800+500+200') + self.window["bg"] = "DimGray" + # self.img_src = Image.open("../data/004.png") + self.img_src = Image.open(os.getcwd() + "/004.png") + self.img_src.load() + # icon + # self.icon = ImageTk.PhotoImage(file='hsv_icon.ico') + # self.window.call('wm','iconphoto',self.window._w,self.icon) + + def choose_file(self): + self.imgpath = filedialog.askopenfilename() + if self.imgpath: + self.img_src = Image.open(self.imgpath) + self.img_src.load() + self.hmin_scale.set(1) + self.hmin_scale.set(0) + self.smin_scale.set(0) + self.vmin_scale.set(0) + self.hmax_scale.set(255) + self.smax_scale.set(255) + self.vmax_scale.set(255) + + def start_mark(self, event): + img_block = self.img_src.copy().convert("HSV") + + t = list(img_block.getdata()) + + t2 = [] + # print(len(t)) + hmin = self.hmin_scale.get() + hmax = self.hmax_scale.get() + smin = self.smin_scale.get() + smax = self.smax_scale.get() + vmin = self.vmin_scale.get() + vmax = self.vmax_scale.get() + for i in range(0, len(t)): + h = t[i][0] + s = t[i][1] + v = t[i][2] + if (h >= hmin) and (h <= hmax) and (s >= smin) and (s <= smax) and (v >= vmin) and (v < vmax): + t2.append((h, s, v)) + else: + t2.append((0, 0, 0)) + # t2.append((max(t[i][0]-50,20),t[i][1],t[i][2])) + img_block.putdata(t2) + self.img = img_block.convert("RGB") + self.img = self.img.resize((1200, 675)) + self.img = ImageTk.PhotoImage(self.img) + BOARD_HEIGHT = 675 + BOARD_WIDTH = 1200 + self.canvas.create_image(BOARD_WIDTH / 2 + 1, BOARD_HEIGHT / 2 + 1, image=self.img) + # self.canvas.create_image(0,0,image=self.img) + # my_window.update() + + def create_widgets(self): + + # scale + self.hmin_label = Label(self.window, text='色调下限', fg='WhiteSmoke', bg="DimGray") + self.hmin_scale = Scale(self.window, orient=HORIZONTAL, from_=0, to=255, resolution=1, command=self.start_mark, + tickinterval=50, length=200, width=7, fg='WhiteSmoke', bg="DimGray") + self.hmax_label = Label(self.window, text='色调上限', fg='WhiteSmoke', bg="DimGray") + self.hmax_scale = Scale(self.window, orient=HORIZONTAL, from_=0, to=255, resolution=1, command=self.start_mark, + tickinterval=50, length=200, width=7, fg='WhiteSmoke', bg="DimGray") + self.smin_label = Label(self.window, text='饱和度下限', fg='WhiteSmoke', bg="DimGray") + self.smin_scale = Scale(self.window, orient=HORIZONTAL, from_=0, to=255, resolution=1, command=self.start_mark, + tickinterval=50, length=200, width=7, fg='WhiteSmoke', bg="DimGray") + self.smax_label = Label(self.window, text='饱和度上限', fg='WhiteSmoke', bg="DimGray") + self.smax_scale = Scale(self.window, orient=HORIZONTAL, from_=0, to=255, resolution=1, command=self.start_mark, + tickinterval=50, length=200, width=7, fg='WhiteSmoke', bg="DimGray") + self.vmin_label = Label(self.window, text='明度下限', fg='WhiteSmoke', bg="DimGray") + self.vmin_scale = Scale(self.window, orient=HORIZONTAL, from_=0, to=255, resolution=1, command=self.start_mark, + tickinterval=50, length=200, width=7, fg='WhiteSmoke', bg="DimGray") + self.vmax_label = Label(self.window, text='明度上限', fg='WhiteSmoke', bg="DimGray") + self.vmax_scale = Scale(self.window, orient=HORIZONTAL, from_=0, to=255, resolution=1, command=self.start_mark, + tickinterval=50, length=200, width=7, fg='WhiteSmoke', bg="DimGray") + + self.hmax_scale.set(255) + self.smax_scale.set(255) + self.vmax_scale.set(255) + # scale position + self.hmin_label.grid(row=0, column=0, padx=15) + self.hmin_scale.grid(row=0, column=1, pady=2) + self.hmax_label.grid(row=1, column=0) + self.hmax_scale.grid(row=1, column=1, pady=2) + self.smin_label.grid(row=2, column=0) + self.smin_scale.grid(row=2, column=1, pady=2) + self.smax_label.grid(row=3, column=0) + self.smax_scale.grid(row=3, column=1, pady=2) + self.vmin_label.grid(row=4, column=0) + self.vmin_scale.grid(row=4, column=1, pady=2) + self.vmax_label.grid(row=5, column=0) + self.vmax_scale.grid(row=5, column=1, pady=2) + + # img + self.img = Image.open(os.getcwd() + "/004.png") + self.img = self.img.resize((1200, 675)) + self.img = ImageTk.PhotoImage(self.img) + + self.canvas = Canvas(my_window, width=1200, height=675) + BOARD_HEIGHT = 675 + BOARD_WIDTH = 1200 + self.canvas.create_image(BOARD_WIDTH / 2 + 1, BOARD_HEIGHT / 2 + 1, image=self.img) + self.canvas.place(x=320, y=30) + # self.canvas.pack() + # self.orign = Label(self.window,image=self.img,width=1200,height=675) + # self.work = Label(self.window,image=self.img,width=800,height=450) + # img position + # self.orign.place(x=320, y=30) + # self.work.place(x=650,y=30) + + self.refresh_button = Button(self.window, text='选图', font=('宋体', 12), command=self.choose_file, height=2, + width=15, fg='blue', bg="BurlyWood") + self.refresh_button.place(x=18, y=380) + + ''' + #Button + + self.import_button = Button(self.window, text='导入原图',font=('隶书',45), height=2, width=9,fg='WhiteSmoke',bg="BurlyWood") + self.clear_button = Button(self.window, text='删除所有',font=('隶书',12), height=2, width=15,fg='WhiteSmoke',bg="BurlyWood") + self.delete_button = Button(self.window, text='删除当前',font=('隶书',12), height=2, width=15,fg='WhiteSmoke',bg="BurlyWood") + self.switch_button = Button(self.window,text='区域切换',font=('隶书',12), height=2, width=15,fg='WhiteSmoke',bg="BurlyWood") + self.save_button = Button(self.window, text='区域暂存',font=('隶书',12), height=2, width=15,fg='WhiteSmoke',bg="BurlyWood") + self.merge_button = Button(self.window, text='合并区域',font=('隶书',12), height=2, width=15,fg='WhiteSmoke',bg="BurlyWood") + self.picture_button = Button(self.window, text='生成图片',font=('隶书',12), height=2, width=15,fg='WhiteSmoke',bg="BurlyWood") + + #button position + self.import_button.place(x=18,y=400) + self.clear_button.place(x=370,y=420) + self.delete_button.place(x=570,y=420) + self.switch_button.place(x=770,y=420) + self.save_button.place(x=370,y=500) + self.merge_button.place(x=570,y=500) + self.picture_button.place(x=770,y=500) + ''' + + def gui_start(): + global my_window + my_window = Tk() + my_gui = GUI(my_window) + my_gui.create_widgets() + my_window.mainloop() + + +GUI.gui_start() \ No newline at end of file diff --git a/utils/path_detect.py b/utils/path_detect.py new file mode 100644 index 0000000..b76dec9 --- /dev/null +++ b/utils/path_detect.py @@ -0,0 +1,37 @@ +import cv2 +import numpy as np + + +# https://www.cnblogs.com/meikaiyuan/p/16805539.html + +def read_image(path): + raw = cv2.imread(path) + # 设定颜色HSV范围,假定为红色 + color_lower = np.array([0, 0, 150]) + color_upper = np.array([255, 255, 209]) + + # 将图像转化为HSV格式 + hsv = cv2.cvtColor(raw, cv2.COLOR_BGR2HSV) + + # 去除颜色范围外的其余颜色 + mask = cv2.inRange(hsv, color_lower, color_upper) + cv2.imshow("mask", mask) + + # 二值化操作 + ret, binary = cv2.threshold(mask, 0, 255, cv2.THRESH_BINARY) + + # 膨胀操作,因为是对线条进行提取定位,所以腐蚀可能会造成更大间隔的断点,将线条切断,因此仅做膨胀操作 + kernel = np.ones((5, 5), np.uint8) + dilation = cv2.dilate(binary, kernel, iterations=1) + # + # img2 = cv2.bitwise_and(img, img, mask=mask) + # cv2.imshow('image', mask) + cv2.waitKey(0) + cv2.destroyAllWindows() + + # 获取图像轮廓坐标,其中contours为坐标值,此处只检测外形轮廓 + contours, hierarchy = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + + +if __name__ == '__main__': + read_image("../data/004.png")