Python для обрезки и сохранения нерегулярного изображения или обрезки и размещения его в центре без изменения размера - PullRequest
0 голосов
/ 15 февраля 2019

Я работаю для сравнения изображений, для которых мне нужно сделать шаблон.

текущее изображение:

original image

Я могу закрасить требуемое изображение, но не могу обрезать требуемое изображение, код дляЦветное изображение выглядит следующим образом:

import numpy as np
import cv2

img = cv2.imread('./org.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret,thresh = cv2.threshold(gray,127,255,1)

contours,h = cv2.findContours(thresh,1,2)

for cnt in contours:
    approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True)
    print (len(approx))
    if len(approx)==5:
        # print "pentagon"
        cv2.drawContours(img,[cnt],0,255,-1)
    elif len(approx)==3:
        # print "triangle"
        cv2.drawContours(img,[cnt],0,(0,255,0),-1)
    elif len(approx)==4:
        # print "square"
        cv2.drawContours(img,[cnt],0,(0,0,255),-1)
    elif len(approx) == 9:
        # print "half-circle"
        cv2.drawContours(img,[cnt],0,(255,255,0),-1)
    elif len(approx) > 15:
        # print "circle"
        cv2.drawContours(img,[cnt],0,(0,255,255),-1)

cv2.imwrite('./test/Image_crop.jpg', img)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

ВЫХОД:

output image

  1. Я хочу обрезать цветное изображение красный .
  2. Сохранить изображение обрезки с помощью нерегулярный Размер.
  3. Есть ли какой-то другой способ получить необходимое изображение, кроме cv2.drawContours

Вопрос зависит от: Сбой библиотек Python для подробногоСравнение изображений между двумя сдвинутыми изображениями, снятыми с помощью веб-камеры

, помогает мне в решении с использованием python .

1 Ответ

0 голосов
/ 15 февраля 2019

Вы можете создать mask из контура и использовать эту маску для копирования из исходного изображения, а затем сохранить изображение.

cv::Mat dst;
originalIamge.copyTo(dst, mask);
cv::imwite("path/where/to/save.jpg", dst);

Обновление: Более подробно .

Создайте ограничивающий прямоугольник из счетчика cv::boundingRect(contour)

cv::Rect rect = cv::boundingRect(contour);

И теперь вы можете использовать этот прямоугольник, чтобы получить субмат из исходного изображения

cv::Mat roi = img(rect);

А затем создайте новый Mat того же размера, что и ROI

cv::Mat dst = cv::Mat::create(roi.size(), CV_8UC3);

И создайте маску

cv::Mat mask = cv::Mat::zeros(img.size(), CV_8UC1);
cv::drawContours(mask, contours, 0, cv::Scalar(255), cv::FILLED);
mask = mask(roi);

Теперь вы можете скопировать необходимыечасть изображения с помощью маски

roi .copyTo(dst, mask);

и сохранения

cv::imwite("path/where/to/save.jpg", dst);
...