You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术求助:实现图像网格添加及最外层网格最高点垂直线绘制

技术指导请求:为图像添加网格并在最外层网格最高点绘制垂直线

我需要编写代码完成以下任务:为图像添加网格,并在每个最外层网格内的最高点处绘制垂直线。以下是相关素材和我尝试的代码,恳请指导!

  • 原图像:原始图像
  • 最终效果图像:最终效果图像

我尝试的代码

import cv2
import numpy as np

# 加载图像
image = cv2.imread('01_img_original.JPG')

# 定义网格参数
grid_size = 50  # 每个网格单元的尺寸
grid_thickness = 1  # 网格线的粗细

# 计算网格的行数和列数
rows, cols, _ = image.shape
num_rows = rows // grid_size
num_cols = cols // grid_size

# 绘制网格线
for i in range(num_rows + 1):
    y = i * grid_size
    cv2.line(image, (0, y), (cols, y), (0, 255, 0), grid_thickness)

for j in range(num_cols + 1):
    x = j * grid_size
    cv2.line(image, (x, 0), (x, rows), (0, 255, 0), grid_thickness)

# 寻找最外层网格中的最大强度点
max_intensity = 0
max_point = None

for i in range(num_rows + 1):
    for j in range(num_cols + 1):
        if i == 0 or i == num_rows or j == 0 or j == num_cols:
            # 获取网格边界
            y1 = i * grid_size
            y2 = min((i + 1) * grid_size, rows)
            x1 = j * grid_size
            x2 = min((j + 1) * grid_size, cols)

            # 寻找网格内的最大强度点
            grid = image[y1:y2, x1:x2]
            grid_gray = cv2.cvtColor(grid, cv2.COLOR_BGR2GRAY)
            min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(grid_gray)
    
# 检查当前最大强度点是否大于之前的最大值
if max_val > max_intensity:
max_intensity = max_val
max_point = (max_loc[0] + x1, max_loc[1] + y1)

# 从最大点绘制直线到图像边界
cv2.line(image, max_point, (max_point[0], 0), (0, 0, 255), 2)
cv2.line(image, max_point, (0, max_point[1]), (0, 0, 255), 2)

# 显示带有网格和直线的图像
cv2.imshow('Grid with Maximum Point Distance', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

问题分析与修正代码

你的代码存在几个关键问题:

  1. 缩进错误:判断最大强度值的if语句和更新逻辑没有嵌套在最外层网格的循环内,导致只会处理最后一个网格的数据。
  2. 需求理解偏差:任务要求是在每个最外层网格内的最高点绘制垂直线,而不是找所有最外层网格中的全局最高点。
  3. 网格范围计算错误:遍历num_rows + 1和num_cols + 1会导致最后一个网格的边界超出图像范围,应该遍历到num_rows和num_cols。

以下是修正后的代码:

import cv2
import numpy as np

# 加载图像
image = cv2.imread('01_img_original.JPG')
if image is None:
    print("无法加载图像,请检查文件路径!")
    exit()

# 定义网格参数
grid_size = 50  # 每个网格单元的尺寸
grid_thickness = 1  # 网格线的粗细

# 计算网格的行数和列数
rows, cols, _ = image.shape
num_rows = rows // grid_size
num_cols = cols // grid_size

# 绘制网格线
for i in range(num_rows + 1):
    y = i * grid_size
    cv2.line(image, (0, y), (cols, y), (0, 255, 0), grid_thickness)

for j in range(num_cols + 1):
    x = j * grid_size
    cv2.line(image, (x, 0), (x, rows), (0, 255, 0), grid_thickness)

# 遍历每个最外层网格,寻找最高点并绘制垂直线
for i in range(num_rows):
    for j in range(num_cols):
        # 判断是否为最外层网格(第一行、最后一行、第一列、最后一列)
        if i == 0 or i == num_rows - 1 or j == 0 or j == num_cols - 1:
            # 计算当前网格的边界
            y1 = i * grid_size
            y2 = min((i + 1) * grid_size, rows)
            x1 = j * grid_size
            x2 = min((j + 1) * grid_size, cols)
            
            # 提取网格区域并转为灰度图
            grid = image[y1:y2, x1:x2]
            grid_gray = cv2.cvtColor(grid, cv2.COLOR_BGR2GRAY)
            
            # 寻找网格内的最大强度点(最亮的点)
            _, max_val, _, max_loc = cv2.minMaxLoc(grid_gray)
            # 转换为图像全局坐标
            global_max_loc = (max_loc[0] + x1, max_loc[1] + y1)
            
            # 绘制垂直线:从最高点到图像顶部边界
            cv2.line(image, global_max_loc, (global_max_loc[0], 0), (0, 0, 255), 2)

# 显示结果图像
cv2.imshow('Grid with Vertical Lines at Outer Grid Peaks', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 可选:保存结果图像
# cv2.imwrite('result_image.jpg', image)

修正说明

  • 缩进修复:将最大点的判断和绘制逻辑嵌套在网格循环内,确保每个最外层网格都被处理。
  • 最外层网格判断:调整循环范围为range(num_rows)和range(num_cols),并通过i == 0 or i == num_rows -1 or j ==0 or j == num_cols-1准确识别最外层网格。
  • 垂直线绘制:按照目标效果,仅绘制从最高点到图像顶部的垂直线(原代码中绘制了两条线,不符合目标图)。
  • 添加图像加载检查:避免因路径错误导致程序崩溃。

内容的提问来源于stack exchange,提问作者lou_a

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:37:05