寻找近左下角与右上角非空像素的函数错误排查求助
问题排查与修正
你的代码存在三个核心错误,导致返回了错误的坐标:
1. 变量名不一致
你初始化了upper_right变量,但后续判断和赋值时误用了未定义的right_up,这会触发NameError,即便没报错也会导致逻辑混乱,必须统一变量名。
2. 初始坐标设置错误
你将left_down初始化为右下角坐标(height-1, width-1),这不是距离左下角最远的参考点,正确的初始值应该设为距离极大的点(或直接用None配合无穷大距离值),确保第一个非黑像素能被选中。
3. 距离判断逻辑完全错误
你用i+j的大小来判断距离,这和目标点的距离毫无关系:
- 距离左下角
(height-1, 0)最近的点,应该计算该点到左下角的距离(比如欧氏距离平方:(i - (height-1))² + (j - 0)²),找最小值;而i+j最小的点是左上角(0,0),所以你的代码会错误地选中左上角。 - 距离右上角
(0, width-1)最近的点,应该计算到右上角的距离(比如欧氏距离平方:(i - 0)² + (j - (width-1))²),找最小值;而i+j最大的点是右下角(height-1, width-1),所以代码会错误地选中右下角。
修正后的代码
import cv2 import numpy as np def find_corner_pixels(img): height, width = img.shape[:2] # 初始化目标点和最小距离 closest_bottom_left = None min_dist_bl = float('inf') closest_top_right = None min_dist_tr = float('inf') # 定义左下角和右上角的坐标 bottom_left = (height - 1, 0) top_right = (0, width - 1) for i in range(height): for j in range(width): # 判断非黑像素 if not np.array_equal(img[i,j], [0,0,0]): # 计算到左下角的欧氏距离平方(避免开根号,提升效率) dist_bl = (i - bottom_left[0]) ** 2 + (j - bottom_left[1]) ** 2 if dist_bl < min_dist_bl: min_dist_bl = dist_bl closest_bottom_left = (i, j) # 计算到右上角的欧氏距离平方 dist_tr = (i - top_right[0]) ** 2 + (j - top_right[1]) ** 2 if dist_tr < min_dist_tr: min_dist_tr = dist_tr closest_top_right = (i, j) return closest_bottom_left, closest_top_right
内容的提问来源于stack exchange,提问作者vojtam
相关产品推荐
相关产品推荐

