opencv轮廓抖动,OpenCV如何平滑轮廓,减少噪音

I extracted the contours of an image, that you can see here:

opencv轮廓抖动,OpenCV如何平滑轮廓,减少噪音_第1张图片

However, it has some noise.

How can I smooth the noise? I did a close up to make clearer what I want to meant

opencv轮廓抖动,OpenCV如何平滑轮廓,减少噪音_第2张图片

Original image that I've used:

opencv轮廓抖动,OpenCV如何平滑轮廓,减少噪音_第3张图片

Code:

rMaskgray = cv2.imread('redmask.jpg', cv2.CV_LOAD_IMAGE_GRAYSCALE)

(thresh, binRed) = cv2.threshold(rMaskgray, 50, 255, cv2.THRESH_BINARY)

Rcontours, hier_r = cv2.findContours(binRed,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)

r_areas = [cv2.contourArea(c) for c in Rcontours]

max_rarea = np.max(r_areas)

CntExternalMask = np.ones(binRed.shape[:2], dtype="uint8") * 255

for c in Rcontours:

if(( cv2.contourArea(c) > max_rarea * 0.70) and (cv2.contourArea(c)< max_rarea)):

cv2.drawContours(CntExternalMask,[c],-1,0,1)

cv2.imwrite('contour1.jpg', CntExternalMask)

解决方案

Try an upgraded to OpenCV 3.1.0. After some code adaptations for the new version as shown below, I tried it out with OpenCV version 3.1.0 and did not see any of the effects you are describing.

import cv2

import numpy as np

print cv2.__version__

rMaskgray = cv2.imread('5evOn.jpg', 0)

(thresh, binRed) = cv2.threshold(rMaskgray, 50, 255, cv2.THRESH_BINARY)

_, Rcontours, hier_r = cv2.findContours(binRed,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)

r_areas = [cv2.contourArea(c) for c in Rcontours]

max_rarea = np.max(r_areas)

CntExternalMask = np.ones(binRed.shape[:2], dtype="uint8") * 255

for c in Rcontours:

if(( cv2.contourArea(c) > max_rarea * 0.70) and (cv2.contourArea(c)< max_rarea)):

cv2.drawContours(CntExternalMask,[c],-1,0,1)

cv2.imwrite('contour1.jpg', CntExternalMask)

opencv轮廓抖动,OpenCV如何平滑轮廓,减少噪音_第4张图片

你可能感兴趣的:(opencv轮廓抖动)