python+opencv-16 图像轮廓检测和拟合
图像轮廓检测和拟合
边缘检测只能检测出图像边缘信息,并不能得到一幅图像的整体信息,而图像轮廓是指将边缘信息连接起来形成一个整体。通过对图像轮廓进行操作,可以获取目标图像的大小、位置和方向等信息。
图像轮廓的查找与绘制
图像轮廓由一系列点组成,这些点以某种方式表示图像中的一条曲线。图像的轮廓绘制就是将检测到的边缘信息图像的前景信息进行拟合,从而得到图像的轮廓。
import cv2 as cv
image = cv.imread("lena.jpg")
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
cv.imshow("image", image)
ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
contours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
image = cv.drawContours(image, contours, -1, (0, 0, 255), 3)
cv.imshow("result", image)
cv.waitKey()
cv.destroyAllWindows()
提起一张图片的情景信息:
import cv2 as cv
import numpy as np
image = cv.imread("lena.jpg")
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
cv.imshow("image", image)
ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
contours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
mask = np.zeros(image.shape, np.uint8)
mask = cv.drawContours(mask, contours, -1, (255, 255, 255), -1)
cv.imshow("mask", mask)
logimg = cv.bitwise_and(image, mask)
cv.imshow("logimg", logimg)
cv.waitKey()
cv.destroyAllWindows()
提取一幅图像的边缘信息:
import cv2 as cv
import numpy as np
image = cv.imread("lena.jpg")
cv.imshow("image", image)
binaryImg = cv.Canny(image, 50, 200)
h = cv.findContours(binaryImg, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
contours = h[0]
temp = np.ones(binaryImg.shape, np.uint8)*255
cv.drawContours(temp, contours, -1, (0, 255, 0), 1)
cv.imshow("contours", temp)
cv.imshow("canny", binaryImg)
cv.waitKey()
cv.destroyAllWindows()
轮廓的周长与面积
import cv2 as cv
image = cv.imread("lunkuo.jpeg"