Jak mogę przycinać obrazy, tak jak zrobiłem to wcześniej w PIL, używając OpenCV.
Przykład roboczy na PIL
im = Image.open('0.png').convert('L')
im = im.crop((1, 1, 98, 33))
im.save('_0.png')
Ale jak mogę to zrobić na OpenCV?
Oto, co próbowałem:
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)
Ale to nie działa.
Myślę, że źle użyłem getRectSubPix
. W takim przypadku wyjaśnij, w jaki sposób mogę poprawnie korzystać z tej funkcji.
crop_img = img[margin:-margin, margin:-margin]
Miałem to pytanie i znalazłem tutaj inną odpowiedź: skopiuj region zainteresowania
Jeśli weźmiemy pod uwagę (0,0) jako lewy górny róg obrazu wywoływany
im
z lewej do prawej jako kierunek x, a z góry na dół jako kierunek y. i mamy (x1, y1) jako lewy górny wierzchołek i (x2, y2) jako prawy dolny wierzchołek regionu prostokąta na tym obrazie, a następnie:oto obszerne źródło informacji na temat indeksowania i dzielenia tablic numpy, które może powiedzieć ci więcej na temat przycinania części obrazu. obrazy byłyby przechowywane w tablicy numpy w opencv2.
:)
źródło
im
nie został poprawnie odczytany i jest pusty. spróbuj użyć IDE z punktami przerwania, aby zdiagnozować kod krok po kroku. możesz użyć google colab do tworzenia bloków kodu i możesz udostępnić swój notatnik jupytor w pokoju czatowym Python, aby uzyskać pomoc.Zauważ, że krojenie obrazu nie tworzy kopii,
cropped image
ale tworzypointer
doroi
. Jeśli ładujesz tak wiele zdjęć, przycinasz odpowiednie części obrazów za pomocą krojenia, a następnie dołączasz do listy, może to być ogromne marnotrawstwo pamięci.Załóżmy, że wczytasz N obrazów
>1MP
i potrzebujesz tylko100x100
regionu z lewego górnego rogu.Slicing
:Alternatywnie możesz skopiować odpowiednią część
.copy()
, więc moduł usuwania śmieci usunieim
.Po odkryciu tego zdałem sobie sprawę jedną z uwag przez user1270710 wymienionych to, ale zajęło mi trochę czasu, aby dowiedzieć się (tzn debugowania itp). Myślę, że warto o tym wspomnieć.
źródło
copy()
zwrotu z inwestycji w porównaniu do krojenia, jaki byłby wynik? Ponadto, jeśli mam zmienną,tmp
w której przechowuję każde zdjęcie ładowane z mojego komputera, krojenie nie powinno mieć złego wpływu na moją pamięć, prawda? Opisany problem dotyczy tylko tego, co dzieje się, gdy załadujesz wszystkie obrazy, a następnie zapiszesz je ponownie ROI, mając zarówno oryginały, jak i ROI . Daj mi znać, jeśli dobrze zrozumiałem.ten kod przycina obraz z x = 0, y = 0 pozycji do h = 100, w = 200
źródło
Poniżej znajduje się sposób przycięcia obrazu.
ścieżka_obrazu: ścieżka do obrazu do edycji
Coords: krotka współrzędnych x / y (x1, y1, x2, y2) [otwórz obraz w mspaint i zaznacz „linijkę” w zakładce widoku, aby zobaczyć współrzędne]
zapisane_lokalizacja : Ścieżka do zapisania przyciętego obrazu
źródło
Solidny kadr z funkcją kopiowania ramki OpenCV:
źródło
x1,y1,x2,y2 = bbox
, mówiąc:TypeError: 'int' object is not iterable
oto kod dla bardziej niezawodnego imcropa (trochę jak w Matlabie)
źródło
Alternatywnie możesz użyć tensorflow do kadrowania i openCV do utworzenia tablicy z obrazu.
Teraz
img
jest tablica kształtu (wysokość obrazu, szerokość obrazu, 3). Przytnij tablicę za pomocą tensorflow:Ponownie złóż obraz za pomocą tf.keras, abyśmy mogli na niego spojrzeć, jeśli zadziałał:
To wydrukuje zdjęcie w notatniku (testowane w Google Colab).
Cały kod razem:
źródło