TypeError: 'TiffImageFile' objekt není subscriptable pro erose obrázek

0

Otázka

Mám následující kód

url = 'https://people.math.sc.edu/Burkardt/data/tif/venus2.tif'

a následující kód číst obraz

from PIL import Image
import requests
from io import BytesIO

response = requests.get(url)
img = Image.open(BytesIO(response.content))
img


k=3
SE= np.ones((k,k), dtype=np.uint8)
constant= (k-1)//2


m,n = (img.size[0], img.size[1])
imgErode= np.zeros((m,n), dtype=np.uint8)


#Erosion without using inbuilt cv2 function for morphology
for i in range(constant, m-constant):
  for j in range(constant,n-constant):
    temp= img[i-constant:i+constant+1, j-constant:j+constant+1]
    product= temp*SE
    imgErode[i,j]= np.min(product)

plt.imshow(imgErode,cmap="gray")
cv2.imwrite("Eroded3.png", imgErode)

a já jsem dostat následující chybu

TypeError: 'TiffImageFile' objekt není subscriptable

cv2 image python tiff
2021-11-19 23:52:14
1

Nejlepší odpověď

2

PIL nevytváří numpy.array ale objekt PIL.Image a vy budete muset převést

img = np.asarray(img)

Další problém:

Po převodu, budete muset použít img.shape místo img.size dostat height, width protože img.size v numpy udává počet bajtů.


from io import BytesIO
import requests
from PIL import Image
import numpy as np
import cv2

url = 'https://people.math.sc.edu/Burkardt/data/tif/venus2.tif'

response = requests.get(url)

img = Image.open(BytesIO(response.content))
print('type:', type(img))

img = np.asarray(img)
print('type:', type(img))

cv2.imshow('original', img)
cv2.waitKey(10)

k = 3
SE = np.ones((k, k), dtype=np.uint8)
constant = (k-1)//2

m, n = img.shape[0:2]
imgErode= np.zeros((m, n), dtype=np.uint8)

#Erosion without using inbuilt cv2 function for morphology
for i in range(constant, m-constant):
    for j in range(constant, n-constant):
        temp = img[i-constant:i+constant+1, j-constant:j+constant+1]
        product = temp * SE
        imgErode[i, j]= np.min(product)

cv2.imshow('converted', imgErode)
cv2.waitKey(10)

cv2.imwrite("Eroded3.png", imgErode)

#cv2.destroyAllWindows()

EDIT:

Načítání obrázku z url pouze pomocí cv2

import requests
import numpy as np
import cv2

url = 'https://people.math.sc.edu/Burkardt/data/tif/venus2.tif'

response = requests.get(url)

arr = np.asarray(bytearray(response.content))#, dtype="uint8")
img = cv2.imdecode(arr, cv2.IMREAD_COLOR)

cv2.imshow('original', img)
cv2.waitKey(100)

Můžete také použít modul imageio ke čtení přímo z url:

import imageio
import cv2

url = 'https://people.math.sc.edu/Burkardt/data/tif/venus2.tif'

img = imageio.imread(url)

cv2.imshow('original', img)
cv2.waitKey(100)
2021-11-20 13:42:53

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................