提取图中苹果的面积、周长和最小外接矩形 在图像处理中,提取对象的关键属性是常见的任务之一。本文将演示如何使用三种流行的编程语言——Python、Matlab和C++,利用相应的图像处理库(OpenCV或Matlab内置函数)来提取图像中苹果的面积、周长和最小外接矩形。
问题描述 我们有一张包含苹果的图片,我们想要从这张图片中提取苹果的关键信息,包括:
苹果的面积(以像素为单位)。
苹果的周长(以像素为单位)。
苹果的最小外接矩形的位置和大小。
Python代码 import cv2image = cv2.imread('apple_image.jpg' ) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) _, binary = cv2.threshold(gray, 120 , 255 , cv2.THRESH_BINARY_INV) contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) apple_contour = max (contours, key=cv2.contourArea) area = cv2.contourArea(apple_contour) perimeter = cv2.arcLength(apple_contour, True ) x, y, w, h = cv2.boundingRect(apple_contour) print ("Area:" , area)print ("Perimeter:" , perimeter)print ("Bounding Box:" , (x, y, w, h))
MATLAB代码 image = imread('apple_image.jpg' ); grayImage = rgb2gray(image); bwImage = imbinarize(grayImage); contours = bwboundaries(bwImage); maxArea = 0 ; for i = 1 :length (contours) area = polyarea(contours{i }(:,2 ), contours{i }(:,1 )); if area > maxArea maxArea = area; appleContour = contours{i }; end end appleArea = maxArea; applePerimeter = sum(sqrt (sum(diff(appleContour).^2 ,2 ))); rect = regionprops(bwImage,'BoundingBox' ); appleRect = rect.BoundingBox; disp ("Area:" + appleArea);disp ("Perimeter:" + applePerimeter);disp ("Bounding Box:" + appleRect);
c++代码 #include <opencv2/opencv.hpp> int main () { cv::Mat image = cv::imread ("apple_image.jpg" ); cv::Mat gray; cv::cvtColor (image, gray, cv::COLOR_BGR2GRAY); cv::Mat thresh; cv::threshold (gray, thresh, 120 , 255 , cv::THRESH_BINARY_INV); std::vector<std::vector<cv::Point>> contours; cv::findContours (thresh, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); double maxArea = 0 ; std::vector<cv::Point> appleContour; for (const auto & contour : contours) { double area = cv::contourArea (contour); if (area > maxArea) { maxArea = area; appleContour = contour; } } double appleArea = maxArea; double applePerimeter = cv::arcLength (appleContour, true ); cv::Rect appleRect = cv::boundingRect (appleContour); std::cout << "Area: " << appleArea << std::endl; std::cout << "Perimeter: " << applePerimeter << std::endl; std::cout << "Bounding Box: " << appleRect << std::endl; return 0 ; }