在 OpenCV (Python) 中使用校正失真裁剪图像

Posted

技术标签:

【中文标题】在 OpenCV (Python) 中使用校正失真裁剪图像【英文标题】:Crop image with corrected distortion in OpenCV (Python) 【发布时间】:2016-12-14 18:53:25 【问题描述】:

我一直在寻找其他帖子中的回复,并尝试了几种方法来获得它,但我找不到任何解决我的问题的方法。我正在尝试纠正图像中的光学失真并且我得到了它,但现在我想裁剪我的图像以删除结果图像中弯曲的黑色边框。所以,总而言之,这是我的问题:

我想这样裁剪:

我尝试使用以下代码进行裁剪:

h,  w = corrected_img.shape[:2]
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(cameraMTX,distortionCoeffs,(w,h),1,(w,h))
x,y,w,h = roi
desired_result = corrected_img[y:y+h, x:x+w]

但不幸的是,roi 总是取值(0,0,0,0)

谁能帮帮我?

提前致谢。

【问题讨论】:

感谢您的回复。使用 alpha=0 只能获得左侧中间部分的一小部分区域。它不起作用。 你能发布你的代码来修复失真吗?这正是我一直在寻找的......裁剪和修复失真...... 【参考方案1】:

由于空白部分在图像中间有其最大值/最小值,您可以寻找中间线,看看何时有颜色变化。下图可以说明这一点:

您只需要找到图片中显示的x1y1x2y2。这可以按如下方式完成:

import cv2
# Reads the image in grayscale
img = cv2.imread('Undistorted.jpg', 0)
h, w = img.shape
x1, x2, y1, y2 = (0,0,0,0)

# Color threshold of the void part
void_th = 10

# List of colors in the vertical an horizontal lines that cross the image in the middle
vertical = [img[i, int(w/2)] for i in range(h)]
horizontal = [img[int(h/2), i] for i in range(w)]

# Reverses both lists
vertical_rev = vertical[::-1]
horizontal_rev = horizontal[::-1]

# Looks when the change of color is done
for i in range(2,h):
    if vertical[i] > void_th and y1 == 0:
        y1 = i
    if vertical_rev[i] > void_th and y2 == 0:
        y2 = i
    if y1 != 0 and y2 != 0:
        break
for i in range(2,w):
    if horizontal[i] > void_th and x1 == 0:
        x1 = i
    if horizontal_rev[i] > void_th and x2 == 0:
        x2 = i
    if x1 != 0 and x2 != 0:
        break

desired_result = img[y1:h-y2, x1:w-x2]
cv2.imshow('Crop', desired_result)

我所做的是中间行中的像素颜色列表,然后循环它们直到颜色高于阈值(0 是黑色,255 是白色)。当检测到第一个颜色变化的像素时,存储位置并中断循环。输出是裁剪后的图像:

注意:由于边界线,我从位置 2 开始循环,不需要原始图像。

希望这有帮助!

【讨论】:

惊人的答案,我的朋友。完整的工作和精彩的解释。恭喜,非常感谢! 非常感谢!我刚刚意识到 void 部分不一定是对称的,所以你必须循环以及反向列表。刚刚编辑!

以上是关于在 OpenCV (Python) 中使用校正失真裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在opencv中使用python语言清理图像中的线条并确保图像不失真

图像校正 - OpenCV - Python

用于 OCR 的 Python OpenCV 偏斜校正

OpenCV在车道线查找中的使用

rectifyStereoImages(图像校正)输出看起来失真

在 Python 中使用 OpenCV 不扭曲点时的不良结果