Обрезка фотографий в Inkscape — OpenArts
Inkscape — это векторный графический редактор, то есть для редактирования фотографий его обычно не используют. Между тем, в Inkscape есть некоторые интересные инструменты обработки растровых изображений, которые вполне заслуживают внимания.
Простая обрезка фотографий в Inkscape
1
Для начала, нам нужно проимпортировать фотографию в Inkscape. Как всем наверняка известно, Inkscape вполне умеет импортировать в текущий документ растровые изображения и работать с ними наряду с векторными объектами. Вы можете просто перетащить файл изображения с исходной папки в окно Inkscape, либо же выбрать в меню File → Import. После этого появится окошко с дополнительными опциями, в котором вы можете, например, выбрать опцию встраивания (Embed) изображения в текущий документ, чтобы не зависеть от исходного файла (иначе при его удалении изображение в текущем документе тоже пропадет).
2
Для примера рассмотрим обрезку фотографии с изображением металлического ключа, лежащего на деревянной поверхности.
3
Обрезка (clipping) в Inkscape — очень простая операция. Для начала нарисуйте прямоугольник (F4 или R) нужного размера поверх фотографии.
4
Теперь выделите оба объекта (фотографию и прямоугольник) и выберите в меню пункт Object → Clip → Set.
5
В результате должно получиться что-то типа этого:
Обрезка по сложному контуру
1
Выше мы рассмотрели обрезку фотографии по простому прямоугольнику. Однако точно так же можно использовать в качестве маски для обрезки гораздо более сложные фигуры. Мы можем выбрать инструмент рисования кривых (Shift+F6 или B), чтобы вручную обвести наш ключ.
2
Ручная обводка по нужному контуру — это в нашем случае самая кропотливая часть работы. Впрочем, форма ключа не такая уж сложная, времени на его обводку понадобится совсем немного. Естественно, перед подобной работой хорошо бы иметь хоть какие-то навыки работы с кривыми.
3
Мы чуть не забыли про отверстие в ключе. При помощи соответствующего инструмента (F5 или E) нарисуйте на его месте круг.
4
Я назначил ключу и кругу разные цвета, чтобы легче их различать. Теперь, чтобы проделать в форме ключа отверстие на месте окружности, выберите в меню Path → Difference (Ctrl+-).
5
Теперь заново перекрасим наш ключ в белый цвет. В диалоге заливки и обводки (Shift+Ctrl+F) я также применил небольшое размывание края формы (Blur), чтобы обрезанное изображение более естественно вписывалось в окружение (без резких границ).
6
Теперь осталось сделать почти то же самое, что мы уже делали с прямоугольником. Выделите оба объекта и на этот раз выберите в меню Object → Mask → Set.
Ниже вы можете видеть результат наложения маски. В отличие от предыдущего случая (клиппинга) в случае маскирования учитывается степень прозрачности, благодаря которой мы получим сглаженную границу.
Фото эффекты в Inkscape
1
В Inkscape можно применять к растровым изображениям некоторые эффекты. В нашем случае нам пригодится эффект, доступный через пункт меню Extensions → Color → Grayscale.
2
Также не помешает создать фон (обычный прямоугольник с градиентной заливкой) и добавить нашему ключику небольшую тень. Для создания тени можно использовать фигуру, которую мы создавали для маскирования — ее достаточно сдвинуть вниз и залить черной полупрозрачной заливкой, также при желании можно чуть увеличить размытость краев.
Как вы теперь можете видеть, обрезка растрового изображения в Inkscape (в том числе с использованием сложных масок) — довольно плевое дело. И эта возможность может очень вам помочь, особенно если вам часто приходится совмещать в одном изображении растровые и векторные элементы.
обрезка python opencv с использованием иерархии контуров
Задавать вопрос
спросил
Изменено 5 лет, 1 месяц назад
Просмотрено 5к раз
Я хотел удалить границы с изображения ниже
то, что я пробовал до сих пор, использует OpenCV для получения краев код:
автообрезка по умолчанию (изображение, порог = 0): """Обрезает любые края ниже или равные порогу Обрезает пустое изображение до размера 1x1. Возвращает обрезанное изображение. """ если len(image.shape) == 3: flatImage = np.max (изображение, 2) еще: плоское изображение = изображение утверждать len(flatImage.shape) == 2 строки = np. where (np.max (flatImage, 0)> порог) [0] если ряды.размер: cols = np.where(np.max(flatImage, 1) > порог)[0] изображение = изображение [столбцы [0]: столбцы [-1] + 1, строки [0]: строки [-1] + 1] еще: изображение = изображение [: 1, : 1] вернуть изображение no_border = автообрезка (новое_изображение) cv2.imwrite('no_border.png',no_border)
результатом является это изображение, далее как удалить эти поля
Обновление:
Я обнаружил, что решение работает для белого фона, но когда я меняю цвет фона, граница не удаляется
Отредактировано 900 30
Но результат был таким
Как мне добиться полного удаления граничных рамок .
- питон
- opencv
Для этого используем функцию floodFill
.
импорт cv2 импортировать numpy как np если __name__ == '__main__': # прочитать изображение и преобразовать в серый цвет img = cv2. imread('image.png',cv2.IMREAD_UNCHANGED) серый = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # порог серого изображения для бинаризации и его отрицания _, двоичный = cv2.threshold (серый, 150, 255, cv2.THRESH_BINARY) двоичный = cv2.bitwise_not (двоичный) # найти внешние контуры всех фигур _, контуры, _ = cv2.findContours (двоичный, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) # создаем маску для функции заполнения, см. документацию ч, ш, _ = изображение.форма маска = np.zeros((h+2,w+2), np.uint8) # определить, какой контур принадлежит квадрату или прямоугольнику для cnt в контурах: poly = cv2.приблизительноPolyDP(cnt, 0,02*cv2.arcLength(cnt,True),True) если len(poly) == 4: # если контур имеет 4 вершины, то заливаем этот контур черным цветом cnt = np.vstack(cnt).squeeze() _, двоичный, _, _ = cv2.floodFill (двоичный, маска, кортеж (cnt [0]), 0) # преобразовать изображение обратно в исходный цвет двоичный = cv2. bitwise_not (двоичный) cv2.imshow('Изображение', бинарный) cv2.waitKey(0) cv2.destroyAllWindows()9
Есть еще один, чтобы найти символы в изображении. Это использует концепцию иерархии в контурах.
Реализация на питоне:
path = r'C:\Desktop\Stack' имя файла = '2.png' img = cv2.imread (os.path.join (путь, имя файла), 1) серый = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, двоичный = cv2.threshold (серый, 0, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU) _, контуры2, иерархия2 = cv2.findContours (двоичный, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE)
Обратите внимание, что в функции cv2.findContours()
передается параметр RETR_CCOMP
для сохранения контуров в соответствии с их различными уровнями иерархии. Иерархия полезна, когда один контур лежит внутри другого контура, что позволяет установить связь родитель-потомок. RETR_CCOMP
помогает определить эту связь.
img2 = img.copy() л = [] для h в иерархии2[0]: если h[0] > -1 и h[2] > -1: л. добавить (ч [2])
В приведенном выше фрагменте я передаю все контуры, у которых есть дочерние элементы, в список л
. Используя l
, я рисую эти контуры во фрагменте ниже.
для центов в л: если число > 0: cv2.drawContours(img2, [contours2[cnt]], 0, (0,255,0), 2) cv2.imshow('img2', img2)
Ознакомьтесь с ДОКУМЕНТАЦИЕЙ ЗДЕСЬ, чтобы узнать больше об иерархии в контурах.
1Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google Зарегистрироваться через Facebook Зарегистрируйтесь, используя электронную почту и парольОпубликовать как гость
Электронная почтаТребуется, но никогда не отображается
Опубликовать как гость
Электронная почтаТребуется, но не отображается
Видео: кадрирование изображения по фигуре
Excel для Microsoft 365 Word для Microsoft 365 Outlook для Microsoft 365 PowerPoint для Microsoft 365 Excel 2021 Word 2021 Outlook 2021 PowerPoint 2021 Excel 2019Word 2019 Outlook 2019 PowerPoint 2019 Excel 2016 Word 2016 Outlook 2016 PowerPoint 2016 Office 2016 Дополнительно… Меньше
Попробуйте!
Улучшите изображение в приложениях Office, придав ему другую форму.
Обрежьте изображение, чтобы оно соответствовало фигуре
-
Выберите изображение.
Выберите вкладку Picture Tools > Format , а затем выберите Crop > Crop to Shape .
В галерее фигур выберите фигуру, которую вы хотите обрезать.
Добавьте рамку к изображению
Выберите вкладку Picture Tools
Выберите цвет границы или выберите Толщину , чтобы сделать границу более заметной.