Ошибки обрезки с помощью OpenCV в Python - кортеж и индексы - PullRequest
0 голосов
/ 23 января 2019

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

При первом методе в моем коде я получаю сообщение об ошибке:

square[(y-height)/2:y-(y-height)/2, (x-width)/2:x-(x-width)/2] = img
TypeError: slice indices must be integers or None or have an __index__ method

Вторым методомв моем коде я получаю сообщение об ошибке

     img = img.resize((basewidth, hsize), PIL.Image.ANTIALIAS)
TypeError: 'tuple' object cannot be interpreted as an integer

Я студент-исследователь, который просто пытается выполнить небольшую задачу в очень большом проекте ИИ - поэтому мы не слишком сосредоточились на синтаксисе,Кто-нибудь сможет помочь мне запустить этот код и достичь желаемого результата?

import Aimports
import cv2
import PIL
import numpy as np

img = cv2.imread("working_image.jpg")

###FIRST OPTION

in_img = "working_image.jpg"

img = cv2.imread(in_img)
##get size
height, width, channels = img.shape
print (in_img,height, width, channels)
## Create a black image
x = height if height > width else width
y = height if height > width else width
square= np.zeros((x,y,3), np.uint8)
##
##This does the job
##
##print(x)
##print(y)
##print(height)
##print(width)
#
square[(y-height)/2:y-(y-height)/2, (x-width)/2:x-(x-width)/2] = img
#
#
cv2.imwrite('modified_image.jpg', square)
cv2.imshow('modified image', square)
cv2.imshow("original", img)
cv2.imshow("black square", square)
cv2.waitKey(0)

###SECOND OPTION

basewidth = 300.0
#print (img.shape)
#wpercent = (basewidth / float(img.size[0]))
wpercent = (basewidth / float(img.shape[0]))
#
#hsize = int((float(img.size[1]) * float(wpercent)))
hsize = int((float(img.shape[1]) * float(wpercent)))
#
img = img.resize((int(basewidth), hsize), PIL.Image.ANTIALIAS)
# 
cv2.imwrite('modified_image.jpg', img)
#
cv2.imshow( "Image Output", img)
#imshow( "Image Output", img )

#The '& 0xFF' is supposedly to get it working on 64-bit machines
#cv2.waitKey(0) & 0xFF
cv2.waitKey(0)
cv2.destroyAllWindows()

#img.save(‘resized_image.jpg')

1 Ответ

0 голосов
/ 23 января 2019

Проблема в том, что говорится в вашей ошибке.

Если вы выбираете индексы, вы не можете использовать ничего, кроме целых чисел, и поскольку вы делите их там, вы получаете некоторое число с плавающей запятой

Ваша вторая ошибка, потому что вы смешиваете 2 библиотеки.'img' - это массив numpy, созданный из функции cv2.imread

, ваш пример будет работать, если вы получите ваше img к

from PIL import Image
img = Image.open('someimage.jpg')
img = img.resize((500, 500), PIL.Image.ANTIALIAS)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...