16

編集:画像に 2 ビット フレームを追加し、コードを使用して、最後に画像をトリミングして余分なフレームを削除することで、問題を回避しました。それは醜い解決策ですが、うまくいきます!


バグなのか経験不足なのかよくわからない問題に遭遇しました。できるだけ明確に要約してみます。

  1. 分析したいカラー画像の輪郭を含むバイナリ画像を取得します (白のピクセルは、アルゴリズムによって検出された輪郭の周囲であり、残りは黒です)。検出したいオブジェクトが画像全体を占めるため、画像はかなり複雑です(「背景」はありません)。

  2. その画像で findcontours を使用します。

    contours, hierarchy = cv2.findContours(image,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE)
    
  3. 次に、「for」ループが「X」ピクセルよりも小さい領域を持つ輪郭を検出し、hierarchy[0][x][3] >= 0(新しい配列を「contours_2」と呼びましょう)

  4. 新しい画像に「contours_2」を描画します。

    cv2.drawContours(image=image2, contours=contours_2, contourIdx=-1, color=(255,255,255), thickness=-1)
    

問題は、 drawcontours がすべての輪郭を適切に描画することですが、画像の境界にある輪郭 (つまり、画像の端に境界が 1 つある輪郭) を「塗りつぶす」わけではありません。画像の境界ピクセル (フレームなど) を True に設定しようとしましたが、機能しません。

前のループでを使用cv2.contourAreaすると、これらの輪郭が適切に検出され、通常の値が返されます。そのため、いつ輪郭が drawcontours によって無視され、いつ正しく塗りつぶされるかを知る方法はありません。cv2.isContourConvexすべての輪郭をfalseとして返すため、まったく機能しません。

輪郭を描画する前に cv2.convexHull を使用してこれらの「エッジ」輪郭を描画できますが、エッジでのみ使用する必要があります(輪郭が変形するため、可能な限り回避したいため)。問題は...どの輪郭が画像の端にあり、どの輪郭がそうでないかを検出する方法がなく、drawcontours で正常に動作することです。

そこで、drawContour がそのように動作する理由と、エッジの輪郭を塗りつぶす方法があるかどうかを尋ねたいと思います。または、別の解決策は、画像の境界にある輪郭を検出する方法を見つけることです (必要に応じて凸包を適用できます)。

4

3 に答える 3

2

エッジに小さな白い線が現れることを除けば、エッジの輪郭を埋めるのに問題はありません。

ここに画像の説明を入力

import cv2
import numpy as np

rows=512
cols=512

# Create image with new colour for replacement
img= np.zeros((rows,cols,3), np.uint8)
img[:,:]= (0,0,0)

#img=cv2.copyMakeBorder(img,1,1,1,1, cv2.BORDER_CONSTANT, value=[0,0,0])

# Draw rectangle
img = cv2.rectangle(img,(400,0),(512,100),(255,255,255),-1)

imggray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


# Find Contour
_, contours, hierarchy = cv2.findContours( imggray.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cv2.drawContours(img, contours, 0, (0,0,255), -1)

cv2.imshow('image',img)
cv2.waitKey(0)
于 2016-04-11T05:08:39.727 に答える