我使用 OpenCV 编写了一个python代码来访问图像然后使用cv2.FindContours
函数我提取了所有轮廓并使用最大的周长过滤了轮廓。
我的目标是现在将此轮廓之外的所有像素都变为黑色,并仅让此轮廓内的像素变为白色。为此,我使用了cv.PointPolygonTest
函数,该函数告诉您点是否在多边形内。但是当我使用cv2.imwrite
编写我的结果时,我也惊讶地看到图像旋转,后来发现它实际上是沿着左上角到右下角的反射图像。
由于我的图像是矩形而不是正方形,这会导致我的一些感兴趣的区域被切断。我将代码与
一起附加输入图片
和输出图像
import cv2
import cv
import copy as cp
import numpy
im_gray = cv2.imread('1191res.jpg', cv2.CV_LOAD_IMAGE_GRAYSCALE)
im_gray2 = cp.copy(im_gray)
contours, hierarchy = cv2.findContours(im_gray2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#loop to calculate the relevant contour index
lperimeter = 0
i = 0
x = 0
while (x < len(contours)):
if(cv2.arcLength(contours[x], True) > lperimeter):
lperimeter = cv2.arcLength(contours[x],True)
i = x
x = x+1
#converting the contours[i] to a type recognized by function cv.PointPolygonTest
result = cv.fromarray(contours[i])
row = len(im_gray)
col = len(im_gray[0])
x = 0
print row
print col
nop = 0
r = 0
c = 0
while r < (row):
c = 0
while c < (col):
if( cv.PointPolygonTest(result,(r,c),False) == -1):
im_gray[r, c] = 0
nop+=1
else:
im_gray[r, c] = 255
c+=1
r+=1
print nop
cv2.imwrite("result1.jpg",im_gray)
答案 0 :(得分:1)
pointPolygonTest接受Point
(x,y)
,即(column, row)
。
您需要将代码更改为:
if( cv.PointPolygonTest(result,(c,r),False) == -1):
^^^