0

Houghlinesメソッドを使用して、白い四角形の各辺に 4 本の線を描画しようとしています。
これは、私が取り組んでいるソース画像 (2592 x 1246 画像) です。

import cv2 as cv
import numpy as np
img = cv.imread("picture_compress.bmp")
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
edges = cv.Canny(img_gray, 100, 200, 5)
lines = cv.HoughLines(edges, rho=2, theta=np.pi / 180, threshold=200)  # lines will be in polar coordinate system
colors = [(0, 0, 255), (0, 255, 0), (255, 0, 0), (255, 0, 255), (255, 255, 0), (0, 255, 255)]

for i, line in enumerate(lines):
    rho, theta = line[0]    # rho --> distance from the coordinate origin (0,0) (Top-Left corner of the image)
                            # theta --> line rotation angle in radius
    # getting the cos(theta) and sin(theta) value
    a = np.cos(theta)
    b = np.sin(theta)
    # getting the origin value(top-left corner of the image)
    x0 = a * rho
    y0 = b * rho
    # 2 points
    pt1 = (int(x0 + 2592 * (-b)), int(y0 + 2592 * a))
    pt2 = (int(x0 - 2592 * (-b)), int(y0 - 2592 * a))
    # draw lines on the input image
    cv.line(img, pt1, pt2, colors[i % len(colors)], thickness=3, lineType=cv.LINE_AA)
print("Total number of lines:", str(len(lines)))
cv.namedWindow("Hough", cv.WINDOW_NORMAL)
cv.imshow("Hough", img)
cv.waitKey(0)

結果 私はResultを取得しています。

最後の画像から、白い塊の縁に複数の線が描かれていることがわかります。

タスク:

  1. 四角形の各辺に 4 本の線のみを描画する最良の方法は何ですか?
  2. HoughLinesP ではなくHoughLinesのみを使用して 4 つの有限ラインを取得するにはどうすればよいですか?

--------------------------------------------------編集済み (2021 年 3 月 17 日) ------------------------------------------ --------

私が取り組んでいる元の画像を投稿させてください。

Fase 1: Eroded_Dilated_Image -侵食膨張を適用し、ブロブを塗りつぶした後の結果。このためのコード:

# This function is used for cleaning the image
def erode_dilate(img, num_iter):                    
    kernel = np.ones((3, 3), np.uint8)
    erosion = cv.erode(src=img, kernel=kernel, iterations=num_iter)
    dilation = cv.dilate(src=erosion, kernel=kernel, iterations=num_iter) 
    return dilation

# This function will search for the blob with max area and will fill it
def find_draw_big_blob(img): 
    contours, _ = cv.findContours(image=img, mode=cv.RETR_TREE, method=cv.CHAIN_APPROX_SIMPLE)
    contour_area = [cv.contourArea(cnt) for cnt in contours]      # List of contours' area
    id_max_area = np.argmax(contour_area)     
    label_max_image = np.zeros(img.shape)
    draw_max_contour = cv.drawContours(image=label_max_image, contours=contours, contourIdx=id_max_area, color=255, thickness=-1)  

img = cv.imread("25559.bmp")
gray_image = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret1, thresh = cv.threshold(gray_image, thresh=127, maxval=255, type=cv.THRESH_OTSU)
image_erode_dilate = erode_dilate(img=thresh, num_iter=2)
big_blob = find_draw_big_blob(img=image_erode_dilate)
cv.imshow("Image", big_blob)

Fase 2: houghlines_Image - hough trasformを適用した後の最終結果。このハフ変換に使用したコードは、すでに問題になっています。

しかし、最終結果は私が望む結果ではありません。このsample_image
に示されている次の結果を達成したいと思います

4

2 に答える 2

1
  • 四角形の各辺に 4 本の線のみを描画する最良の方法は何ですか?

長方形の各辺に 4 本の線のみを描画する最良の方法は、fast-line-detectorを使用することです

以下に、fast-line-detector の仕組みを示します。

ここに画像の説明を入力

コード:


# Load the library
import cv2

# Load the image
img = cv2.imread("BWzd2.png")

# Convert to gray-scale
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Init. the fast-line-detector (fld)
fld = cv2.ximgproc.createFastLineDetector().detect(gry)

# Detect the lines
for line in fld:

    # Get current coordinates
    x1 = int(line[0][0])
    y1 = int(line[0][1])
    x2 = int(line[0][2])
    y2 = int(line[0][3])

    # Draw the line
    cv2.line(img, (x1, y1), (x2, y2), (255, 0, 255), 5)

# Display
cv2.imshow("img", img)
cv2.waitKey(0)

結果:

ここに画像の説明を入力

于 2021-03-03T11:49:23.827 に答える