Обрезка полутоновых изображений на больших изображениях с использованием OpenCV и python - PullRequest
0 голосов
/ 08 июня 2018

Привет, я новичок в python и opencv.У меня есть это изображение: this

Я пытаюсь обрезать полутоновые изображения с картинки.На данный момент код находит самую большую ограничивающую рамку, то есть верхнее правое изображение, а затем обрезает ее.Я хочу найти все изображения в оттенках серого, даже если их больше 4, и обрезать их все.Я думаю об использовании цикла, чтобы сделать это, но я не хочу устанавливать цикл, где он находит самые большие ограничивающие прямоугольники 4 раза, а затем останавливается, так как другие изображения, которые я обрабатываю, содержат более 4 изображений.Любая помощь будет принята с благодарностью!

import cv2
import numpy as np

# load image
img = cv2.imread('multi.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # convert to grayscale
# threshold to get just the signature (INVERTED)
retval, thresh_gray = cv2.threshold(gray, thresh=100, maxval=255, \
                                    type=cv2.THRESH_BINARY_INV)

image, contours, hierarchy = cv2.findContours(thresh_gray,cv2.RETR_LIST, \
                                              cv2.CHAIN_APPROX_SIMPLE)

# Find object with the biggest bounding box
mx = (0,0,0,0)      # biggest bounding box so far
mx_area = 0
for cont in contours:
    x,y,w,h = cv2.boundingRect(cont)
    area = w*h
    if area > mx_area:
        mx = x,y,w,h
        mx_area = area
x,y,w,h = mx

# Find object with the biggest bounding box

mx = (0,0,0,0)      # biggest bounding box so far
mx_area = 0
for cont in contours:
    x,y,w,h = cv2.boundingRect(cont)
    area = w*h
    if area > mx_area:
        mx = x,y,w,h
        mx_area = area
x,y,w,h = mx

# Output to files
roi=img[y:y+h,x:x+w]
cv2.imwrite('Image_crop.jpg', roi)

cv2.rectangle(img,(x,y),(x+w,y+h),(200,0,0),2)
cv2.imwrite('Image_cont.jpg', img)

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Я разработал свой комментарий.

В предоставленном вами коде контуры находятся с использованием cv2.RETR_LIST, который включает все возможные контуры на изображении, включая те, которые присутствуют в контурах.Я использовал cv2.RETR_EXTERNAL, который игнорирует эти контуры внутри других контуров.

image = cv2.imread(r'C:\Users\Desktop\g.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

retval, thresh_gray = cv2.threshold(gray, thresh=100, maxval=255, \
                                    type=cv2.THRESH_BINARY_INV)
cv2.imshow('thresh_gray.png', thresh_gray)

image, contours, hierarchy = cv2.findContours(thresh_gray,cv2.RETR_EXTERNAL,                                                 cv2.CHAIN_APPROX_SIMPLE)

for i, c in enumerate(contours):
    if cv2.contourArea(c) > 10000:
        x, y, w, h = cv2.boundingRect(c)
        roi = image[y  :y + h, x : x + w ]

        cv2.imshow('Region_{}.jpg'.format(i), roi)
        cv2.waitKey(0)

cv2.destroyAllWindows()
0 голосов
/ 08 июня 2018

Ваш фон всегда зеленый, и у вас будут только изображения в оттенках серого?Если да, то я думаю, что лучшим способом было бы замаскировать зеленый цвет (то есть найти пиксели, где пиксель зеленый), и теперь вы получаете информацию о том, какие все пиксели находятся в серой шкале.Если нет, вы можете подать его, используя hsv, так как изображения в градациях серого имеют насыщенность = 0 и переменное значение от 0 до 100% HSV

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...