在 OpenCV 中裁剪图像并校正失真 (Python)
Crop image with corrected distortion in OpenCV (Python)
我一直在其他帖子中寻找回复并尝试了几种方法来获得它,但我找不到任何解决我问题的方法。我正在尝试校正图像中的光学失真并且我明白了,但现在我想裁剪图像以删除结果图像中的弯曲黑色边框。所以,总而言之,这是我的问题:
我想这样裁剪:
我尝试使用以下代码进行裁剪:
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)
。
谁能帮帮我?
提前致谢。
由于空白部分maximum/minimum在图像的中间,您可以寻找中间的线条,看看何时有颜色变化。下图可能会阐明这一点:
您只需找到图中所示的x1
、y1
、x2
和y2
即可。这可以按如下方式完成:
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 开始循环,对于原始图像,这是不需要的。
希望对您有所帮助!
我一直在其他帖子中寻找回复并尝试了几种方法来获得它,但我找不到任何解决我问题的方法。我正在尝试校正图像中的光学失真并且我明白了,但现在我想裁剪图像以删除结果图像中的弯曲黑色边框。所以,总而言之,这是我的问题:
我想这样裁剪:
我尝试使用以下代码进行裁剪:
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)
。
谁能帮帮我?
提前致谢。
由于空白部分maximum/minimum在图像的中间,您可以寻找中间的线条,看看何时有颜色变化。下图可能会阐明这一点:
您只需找到图中所示的x1
、y1
、x2
和y2
即可。这可以按如下方式完成:
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 开始循环,对于原始图像,这是不需要的。
希望对您有所帮助!