gpt4 book ai didi

python - 使用opencv python连接/合并图像

转载 作者:行者123 更新时间:2023-12-02 16:27:23 24 4
gpt4 key购买 nike

我正在尝试从手写手稿创建基于纹理的图像。对输入图像(文本行形式的IAM数据库的二进制图像)进行一些预处理之后,使用垂直轮廓投影将这些行分割为单词/字符。分割的单词/字符的大小不同,我想对其进行合并/合并以形成所需的基于纹理的图像。输出图像的大小使叠加变得不可能。我正在将openCV与python结合使用,我想要一些想法或方法来完成此类任务。此方法的灵感来自R. K. Hanusiak the article link在第219-220页中的“使用基于纹理的特征进行作家验证”。

Concatenated images alined with it's center of mass

Text sample on the left, and it's texture-base images on the right

最佳答案

这是一个可能的解决方案。当然,您必须调整一些参数...

我的示例代码做什么:

  • 应用threshold并将图像反转(bitwise_not)以获取具有黑色背景和白色字母的二进制图像
  • 应用一个小的dilate合并一些小元素并减少检测次数
  • 使用findContours来...找到轮廓:)
  • 为每个轮廓计算boundingRectarea,返回检测到文字的矩形(可用于过滤不想要的小元素的区域)
  • 准备一个与源图像重叠的轮廓和矩形图像(此部分仅用于调试)

  • 检测到之后,代码继续创建所需的新“纹理图像”:
  • total_width是所有矩形宽度
  • 的总和
  • mean_height是所有爬行高度的平均值
  • total_lines是新图像中的行数;根据total_widthmean_height计算得出,因此生成的图像近似为方形
  • 循环内的
  • ,我们将每个矩形从src图像复制到newImg
  • curr_linecurr_width跟踪将src矩形粘贴到
  • 的位置
  • 我已经使用cv.min()将每个新矩形混合到newImg中了;这类似于Photoshop
  • 中的“暗化”混合模式

    显示检测结果的图像:

    enter image description here

    生成的纹理图像:

    enter image description here

    代码...
    import cv2 as cv
    import numpy as np
    import math

    src = cv.imread("handwriting.jpg")
    src_gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)

    # apply threshold
    threshold = 230
    _, img_thresh = cv.threshold(src_gray, threshold, 255, 0)
    img_thresh = cv.bitwise_not(img_thresh)

    # apply dilate
    dilatation_size = 1
    dilatation_type = cv.MORPH_ELLIPSE
    element = cv.getStructuringElement(dilatation_type, (2*dilatation_size + 1, 2*dilatation_size+1), (dilatation_size, dilatation_size))
    img_dilate = cv.dilate(img_thresh, element)

    # find contours
    contours = cv.findContours(img_dilate, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

    # calculate rectangles and areas
    boundRect = [None]*len(contours[1])
    areas = [None]*len(contours[1])
    for i, c in enumerate(contours[1]):
    boundRect[i] = cv.boundingRect(c)
    areas[i] = cv.contourArea(c)

    # set drawing
    drawing = np.zeros((src.shape[0], src.shape[1], 3), dtype=np.uint8)

    # you can use only contours bigger than some area
    for i in range(len(contours[1])):
    if areas[i] > 1:
    color = (50,50,0)
    cv.rectangle(drawing, (int(boundRect[i][0]), int(boundRect[i][1])), \
    (int(boundRect[i][0]+boundRect[i][2]), int(boundRect[i][1]+boundRect[i][3])), color, 2)

    # set newImg
    newImg = np.ones((src.shape[0], src.shape[1], 3), dtype=np.uint8)*255
    total_width = 0
    mean_height = 0.0
    n = len(boundRect)
    for r in (boundRect):
    total_width += r[2]
    mean_height += r[3]/n

    total_lines = math.ceil(math.sqrt(total_width/mean_height))
    max_line_width = math.floor(total_width/total_lines)

    # loop through rectangles and perform a kind of copy paste
    curr_line = 0
    curr_width = 0
    for r in (boundRect):
    if curr_width > max_line_width:
    curr_line += 1
    curr_width = 0
    # this is the position in newImg, where to insert source rectangle
    pos = [curr_width, \
    curr_width + r[2], \
    math.floor(curr_line*mean_height), \
    math.floor(curr_line*mean_height) + r[3] ]
    s = src[r[1]:r[1]+r[3], r[0]:r[0]+r[2], :]
    d = newImg[pos[2]:pos[3], pos[0]:pos[1], :]
    newImg[pos[2]:pos[3], pos[0]:pos[1], :] = cv.min(d,s)
    curr_width += r[2]

    cv.imwrite('detection.png',cv.subtract(src,drawing))
    cv.imshow('blend',cv.subtract(src,drawing))

    crop = int(max_line_width*1.1)
    cv.imwrite('texture.png',newImg[:crop, :crop, :])
    cv.imshow('newImg',newImg[:crop, :crop, :])

    cv.waitKey()

    关于python - 使用opencv python连接/合并图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60625736/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com