从给定4点坐标的图像中提取任意矩形补丁 [英] Extract an arbitrary rectangular patch from an image given 4 point coordinates

查看:177
本文介绍了从给定4点坐标的图像中提取任意矩形补丁的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给出一个图像中的四个任意点的坐标(保证形成一个矩形),我想提取它们代表的面片,并获得相同点的矢量化(平面)表示.我该怎么办?

Given the coordinates of four arbitrary points in an image (which are guaranteed to form a rectangle), I want to extract the patch that they represent and get a vectorized (flat) representation of the same. How can I do this?

我看到了这个问题的答案并使用它可以找到所需的补丁程序.例如,给定该图像中绿色矩形的4个角的图像坐标:

I saw the answer to this question and using it I am able to reach to the patch that I require. For example, given the image coordinates of the 4 corners of the green rectangle in this image:

我能够找到补丁并得到类似的东西:

I am able to get to the patch and get something like:

使用以下代码:

p1 = (334,128)
p2 = (438,189)
p3 = (396,261)
p4 = (292,200)
pts = np.array([p1, p2, p3, p4])

mask = np.zeros((img.shape[0], img.shape[1]))

cv2.fillConvexPoly(mask, pts, 1)
mask = mask.astype(np.bool)

out = np.zeros_like(img)
out[mask] = img[mask]
patch = img[mask]

cv2.imwrite(img_name, out)

但是,问题是当以行优先顺序将图像读取为矩阵时,我获得的patch变量只是图像中属于该补丁的所有像素的数组.

However, the problem is that the patch variable that I obtain is simply an array of all pixels of the image that belong to the patch, when the image is read as a matrix in row-major order.

我想要的是patch变量应包含可以形成真实图像的顺序的像素,以便我可以对其执行操作.我应该意识到有一个opencv函数可以帮助我做到这一点吗?

What I want is that patch variable should contain the pixels in the order they can form a genuine image so that I can perform operations on it. Is there an opencv function that I should be aware of that would help me in doing this?

谢谢!

推荐答案

这是实现此方法的方法:

This is how you can implement this:

代码:

    # create a subimage with the outer limits of the points
    subimg = out[128:261,292:438]

    # calculate the angle between the 2 'lowest' points, the 'bottom' line
    myradians = math.atan2(p3[0]-p4[0], p3[1]-p4[1])
    # convert to degrees 
    mydegrees = 90-math.degrees(myradians)

    # create rotationmatrix
    h,w = subimg.shape[:2]
    center = (h/2,w/2)
    M = cv2.getRotationMatrix2D(center, mydegrees, 1)
    # rotate subimage
    rotatedImg = cv2.warpAffine(subimg, M, (h, w))

结果:

接下来,通过删除所有100%黑色的行/列,可以轻松裁剪图像中的黑色区域.
最终结果:

代码:

Next, the black areas in the image can be easily cropped by removing all rows/columns that are 100% black.
Final result:

Code:

    # converto image to grayscale
    img = cv2.cvtColor(rotatedImg, cv2.COLOR_BGR2GRAY)

    # sum each row and each volumn of the image
    sumOfCols = np.sum(img, axis=0)
    sumOfRows = np.sum(img, axis=1)

    # Find the first and last row / column that has a sum value greater than zero, 
    # which means its not all black. Store the found values in variables
    for i in range(len(sumOfCols)):
            if sumOfCols[i] > 0:
                    x1 = i
                    print('First col: ' + str(i))
                    break

    for i in range(len(sumOfCols)-1,-1,-1):
            if sumOfCols[i] > 0:
                    x2 = i
                    print('Last col: ' + str(i))
                    break

    for i in range(len(sumOfRows)):
            if sumOfRows[i] > 0:
                    y1 = i
                    print('First row: ' + str(i))
                    break

    for i in range(len(sumOfRows)-1,-1,-1):
            if sumOfRows[i] > 0:
                    y2 = i
                    print('Last row: ' + str(i))
                    break

    # create a new image based on the found values
    finalImage = rotatedImg[y1:y2,x1:x2]

这篇关于从给定4点坐标的图像中提取任意矩形补丁的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆