我有两张相同的图像,只是区别之一是其中包含一些文本。我想在该文本周围制作一个边框或多边形框。为此,我尝试比较这两个图像并测量差异区域,然后在不同区域或仅文本区域周围制作一个边框。
原始图像

文字+原始图片


before = cv2.imread('before.jpg')
after = cv2.imread('after.jpg')

# Convert images to grayscale
before_gray = cv2.cvtColor(before, cv2.COLOR_BGR2GRAY)
after_gray = cv2.cvtColor(after, cv2.COLOR_BGR2GRAY)

# Compute SSIM between two images
(score, diff) = compare_ssim(before_gray, after_gray, full=True)
print("Image similarity", score)

# The diff image contains the actual image differences between the two images
# and is represented as a floating point data type in the range [0,1]
# so we must convert the array to 8-bit unsigned integers in the range
# [0,255] before we can use it with OpenCV
diff = (diff * 255).astype("uint8")

# Threshold the difference image, followed by finding contours to
# obtain the regions of the two input images that differ
thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
contours = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]

or c in contours:
    area = cv2.contourArea(c)
    if area > 40:
        x,y,w,h = cv2.boundingRect(c)
        cv2.rectangle(before, (x, y), (x + w, y + h), (36,255,12), 2)
        cv2.rectangle(after, (x, y), (x + w, y + h), (36,255,12), 2)

问题是,它无法使用旋转文本和曲线形状文本的边界框捕获。请查看下图:
比较结果

通缉
我想实现一个合适的边界框,或者如果可能的话,围绕文本设置多边形框,无论旋转还是弯曲。预期的演示输出如下:
预期结果

最佳答案

您需要计算每个文本位置的点序列。

for c in contours:
    area = cv2.contourArea(c)
    if area > 40:
        x, y, w, h = cv2.boundingRect(c)
        rectangle = cv2.minAreaRect(c)
        box = np.int0(cv2.boxPoints(rectangle))
        cv2.drawContours(after, [box], 0, (0, 191, 255), 2)
输出:
python - 检测和定位两个与文本不同的图像中的区域(纯色/曲线/旋转)-LMLPHP

关于python - 检测和定位两个与文本不同的图像中的区域(纯色/曲线/旋转),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63658602/

10-11 23:00
查看更多