怎么做自己的彩票網(wǎng)站現(xiàn)在有哪些網(wǎng)址
提取圖中蘋果的面積、周長和最小外接矩形
在圖像處理中,提取對象的關(guān)鍵屬性是常見的任務(wù)之一。本文將演示如何使用三種流行的編程語言——Python、Matlab和C++,利用相應(yīng)的圖像處理庫(OpenCV或Matlab內(nèi)置函數(shù))來提取圖像中蘋果的面積、周長和最小外接矩形。
問題描述
我們有一張包含蘋果的圖片,我們想要從這張圖片中提取蘋果的關(guān)鍵信息,包括:
- 蘋果的面積(以像素為單位)。
- 蘋果的周長(以像素為單位)。
- 蘋果的最小外接矩形的位置和大小。
Python代碼
import cv2# 讀取圖片
image = cv2.imread('apple_image.jpg')# 轉(zhuǎn)換為灰度圖像
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)# 假設(shè)最大的輪廓為蘋果
apple_contour = max(contours, key=cv2.contourArea)# 計(jì)算面積和周長
area = cv2.contourArea(apple_contour)
perimeter = cv2.arcLength(apple_contour, True)# 找到最小外接矩形
x, y, w, h = cv2.boundingRect(apple_contour)# 顯示結(jié)果
print("Area:", area)
print("Perimeter:", perimeter)
print("Bounding Box:", (x, y, w, h))
MATLAB代碼
% 讀取圖片
image = imread('apple_image.jpg');% 轉(zhuǎn)換為灰度圖像
grayImage = rgb2gray(image);% 使用閾值分割圖像
bwImage = imbinarize(grayImage);% 查找輪廓
contours = bwboundaries(bwImage);% 假設(shè)最大的輪廓為蘋果
maxArea = 0;
for i = 1:length(contours)area = polyarea(contours{i}(:,2), contours{i}(:,1));if area > maxAreamaxArea = area;appleContour = contours{i};end
end% 計(jì)算面積和周長
appleArea = maxArea;
applePerimeter = sum(sqrt(sum(diff(appleContour).^2,2)));% 找到最小外接矩形
rect = regionprops(bwImage,'BoundingBox');
appleRect = rect.BoundingBox;% 顯示結(jié)果
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");// 轉(zhuǎn)換為灰度圖像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);// 假設(shè)最大的輪廓為蘋果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;}}// 計(jì)算面積和周長double appleArea = maxArea;double applePerimeter = cv::arcLength(appleContour, true);// 找到最小外接矩形cv::Rect appleRect = cv::boundingRect(appleContour);// 顯示結(jié)果std::cout << "Area: " << appleArea << std::endl;std::cout << "Perimeter: " << applePerimeter << std::endl;std::cout << "Bounding Box: " << appleRect << std::endl;return 0;
}