Как я могу обрезать изображения, как я делал это раньше в PIL, используя OpenCV.
Рабочий пример на PIL
im = Image.open('0.png').convert('L')
im = im.crop((1, 1, 98, 33))
im.save('_0.png')
Но как я могу сделать это на OpenCV?
Вот что я попробовал:
im = cv.imread('0.png', cv.CV_LOAD_IMAGE_GRAYSCALE)
(thresh, im_bw) = cv.threshold(im, 128, 255, cv.THRESH_OTSU)
im = cv.getRectSubPix(im_bw, (98, 33), (1, 1))
cv.imshow('Img', im)
cv.waitKey(0)
Но это не работает.
Я думаю, что неправильно использовал getRectSubPix
. Если это так, пожалуйста, объясните, как я могу правильно использовать эту функцию.
crop_img = img[margin:-margin, margin:-margin]
у меня был этот вопрос и я нашел другой ответ здесь: скопируйте область интереса
Если мы рассмотрим (0,0) как верхний левый угол изображения, называемый
im
слева направо как направление x и сверху вниз как направление y. и мы имеем (x1, y1) как верхнюю левую вершину и (x2, y2) как нижнюю правую вершину области прямоугольника в этом изображении, тогда:Вот исчерпывающий ресурс по индексированию и разрезанию массива, который может рассказать вам больше о таких вещах, как обрезка части изображения. изображения будут храниться в виде массива в opencv2.
:)
источник
im
было прочитано неправильно и является пустым. попробуйте использовать IDE с точками останова для пошаговой диагностики вашего кода. вы можете использовать Google Colab для создания блоков кода и поделиться своей записной книжкой jupytor в чат-комнате stackoverflow, чтобы получить помощь от кого-то.Обратите внимание, что нарезка изображения не создает копию,
cropped image
а создаетpointer
дляroi
. Если вы загружаете так много изображений, обрезаете соответствующие части изображений с нарезкой, а затем добавляете их в список, это может привести к огромным потерям памяти.Предположим, вы загружаете N изображений,
>1MP
и вам нужна только100x100
область из верхнего левого угла.Slicing
:Кроме того, вы можете скопировать соответствующую часть
.copy()
, так что сборщик мусора удалитim
.Узнав об этом, я понял, что один из комментариев пользователя user1270710 упомянул это, но мне потребовалось довольно много времени, чтобы выяснить это (т.е. отладка и т. Д.) Так что, думаю, стоит упомянуть.
источник
copy()
окупаемость инвестиций, по сравнению с нарезкой, каков будет результат? Кроме того, если у меня есть переменная,tmp
в которой я сохраняю каждое изображение, загружаемое с моего компьютера, нарезка не должна плохо влиять на мою память, верно? Проблема, которую вы описываете, связана только с тем, что происходит, когда вы загружаете все изображения, а затем снова сохраняете их ROI с оригиналами и ROI . Пожалуйста, дайте мне знать, если я правильно понял.этот код обрезает изображение с позиции x = 0, y = 0 до h = 100, w = 200
источник
Ниже приведен способ обрезки изображения.
image_path: путь к изображению для редактирования
Координаты: кортеж координат x / y (x1, y1, x2, y2) [откройте изображение в mspaint и проверьте «линейку» на вкладке вида, чтобы увидеть координаты]
save_location : путь для сохранения обрезанного изображения
источник
Надежная обрезка с функцией копирования границы opencv:
источник
x1,y1,x2,y2 = bbox
когда я говорю:TypeError: 'int' object is not iterable
вот некоторый код для более надежного imcrop (немного похоже на matlab)
источник
В качестве альтернативы вы можете использовать тензорный поток для обрезки и openCV для создания массива из изображения.
Теперь
img
это (imageheight, imagewidth, 3) массив форм. Обрезать массив с помощью тензорного потока:Соберите изображение с помощью tf.keras, чтобы мы могли посмотреть на него, если оно сработало:
Это распечатывает изображение в блокноте (проверено в Google Colab).
Весь код вместе:
источник