如何从图像中裁剪和保存分割的对象?

Ale*_*ena 4 python image image-processing computer-vision image-segmentation

我有一张高光谱图像。每幅图像中都有许多物体。我必须对它们进行分割、裁剪并将它们保存为单独的图像。应用阈值处理后的分割图像如下:

在此输入图像描述

问题是我必须裁剪分段对象并保存它们。怎样才能做到呢?

nat*_*ncy 5

这是一个简单的方法:

  1. 获取二值图像。 加载图像,转换为灰度,以及Otsu的阈值,得到二值图像。

  2. 消除噪音。我们进行形态学操作来去除图像中的任何噪声颗粒。

  3. 提取对象。从这里我们找到轮廓,获得每个边界矩形,然后使用 Numpy 切片提取并保存每个 ROI。


检测到的物体

在此输入图像描述

保存的投资回报率

在此输入图像描述

import cv2
import numpy as np

# Load image, grayscale, Otsu's threshold
image = cv2.imread('1.jpg')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# Morph open to remove noise
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)

# Find contours, obtain bounding box, extract and save ROI
ROI_number = 0
cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
    ROI = original[y:y+h, x:x+w]
    cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
    ROI_number += 1

cv2.imshow('image', image)
cv2.imshow('thresh', thresh)
cv2.imshow('opening', opening)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)