python实现tkinter图形界面+彩色图像转换为灰度图+车道线图像去噪+Prewitt 一阶边缘检测算子检测车道边缘线+生成 Mask 掩模+直线检测+ 绘制车道线
时间: 2023-08-07 18:03:03 浏览: 202
基于Python实现的简易图像修复应用源码,采用Tkinter实现图形界面,采用FMM或NS算法进行图像修复
好的,下面是实现这个功能的 Python 代码,包括了图形界面的设计:
```python
import cv2
import numpy as np
import tkinter as tk
from PIL import Image, ImageTk
class LaneDetectionGUI:
def __init__(self):
self.root = tk.Tk()
self.root.title('Lane Detection')
# 创建界面控件
self.image_label = tk.Label(self.root)
self.image_label.pack(side='left', padx=10, pady=10)
self.button_frame = tk.Frame(self.root)
self.button_frame.pack(side='left', padx=10, pady=10)
self.load_button = tk.Button(self.button_frame, text='Load Image', command=self.load_image)
self.load_button.pack(side='top', padx=10, pady=5)
self.detect_button = tk.Button(self.button_frame, text='Detect Lane', command=self.detect_lane)
self.detect_button.pack(side='top', padx=10, pady=5)
# 初始化界面变量
self.image = None
self.result = None
self.root.mainloop()
def load_image(self):
# 读入图像文件并显示在界面上
file_path = tk.filedialog.askopenfilename()
if file_path:
self.image = cv2.imread(file_path)
self.show_image(self.image)
def detect_lane(self):
if self.image is not None:
# 将原始图像转换为灰度图像
gray = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
# 对灰度图像进行高斯模糊去噪
blur = cv2.GaussianBlur(gray, (5, 5), 0)
# 使用 Prewitt 算子进行边缘检测
prewitt_x = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]])
prewitt_y = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]])
edge_x = cv2.filter2D(blur, -1, prewitt_x)
edge_y = cv2.filter2D(blur, -1, prewitt_y)
edge = cv2.addWeighted(edge_x, 0.5, edge_y, 0.5, 0)
# 生成车道线的 Mask 掩模
mask = np.zeros_like(edge)
mask[200:400, :] = 255
# 对边缘检测结果应用 Mask 掩模
masked_edge = cv2.bitwise_and(edge, mask)
# 进行直线检测
lines = cv2.HoughLinesP(masked_edge, rho=1, theta=np.pi/180, threshold=50, minLineLength=50, maxLineGap=5)
# 绘制车道线
result = self.image.copy()
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(result, (x1, y1), (x2, y2), (0, 255, 0), 2)
self.result = result
self.show_image(self.result)
def show_image(self, image):
# 将 OpenCV 图像转换为 PIL 图像并在界面上显示
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = Image.fromarray(image)
image = ImageTk.PhotoImage(image)
self.image_label.configure(image=image)
self.image_label.image = image
if __name__ == '__main__':
LaneDetectionGUI()
```
在上述代码中,我们使用 tkinter 库创建了一个简单的图形界面,其中包括了两个按钮:Load Image 和 Detect Lane。当用户点击 Load Image 按钮时,程序会弹出文件选择对话框,让用户选择要处理的图像文件。当用户点击 Detect Lane 按钮时,程序会对加载的图像进行车道线检测,并将结果显示在界面上。
在实际应用中,我们可以根据需要进行界面的优化和改进,以提高用户的交互体验和操作效率。
阅读全文