Image.open() cannot identify image file in python script file - python

I am trying to execute this script
from PIL import Image
im = Image.open("image.jpg")
nx, ny = im.size
It is working fine when I run it in python shell
pytesser_v0.0.1]#env python
>>> from PIL import Image
>>> im = Image.open("image.jpg")
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=46x24 at 0x7FA4688F16D0>
but when I put it in a some test.py file and run it like python test.py
I am getting this error
File "test1.py", line 17, in <module>
im = Image.open("image.jpg")
File "/usr/local/python.2.7.11/lib/python2.7/site-packages/PIL/Image.py", line 2309, in open
% (filename if filename else fp))
IOError: cannot identify image file 'image.jpg'
please help me with this issue, Thanks
PS: Earlier I installed PIL from Imaging-1.1.7 setup.py, later I installed Pillow, I think the problem was in the mutual presence of the PIL and Pillow library on the machine.

Seems like PIL library haven't fixed this bug yet.
Here is my solution:
Open image using OpenCV library, then convert it to PIL image
from PIL import Image
import cv2
image_path = 'Folder/My_picture.jpg'
# read image using cv2 as numpy array
cv_img = cv2.imread(image_path)
# convert the color (necessary)
cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
# read as PIL image in RGB
pil_img = Image.fromarray(cv_img).convert('RGBA')
Then you can operate with it as with a regular PIL image object.

Make sure that "image.jpg" is in the same directory as "test1.py".
If it isn't then you could either move it, or put the correct directory inside of Image.open().

I have the same issue.
This is because the test.py does not have the same pathname. If you are working in the same folder it will work.
However, the solution i found was to put in the full path + file name so that it is unambiguous.
"c:\...fullpath...\image.jpg"
You can do it like this:
from PIL import Image
import os
curDir = os.getcwd()
fileName = "image.jpg"
fn = curDir + "\\" + fileName
print(fn)
image = Image.open(fn)
image.show()
This works. Please let me know if you find better.

Related

How can I edit all images inside of a directory with python with pillow?

I have some images with 24 bit depth that I should convert them to 8 bit depth.
So I can do it for one image but for multiple images I get this error :
a=img.convert("P", palette=Image.ADAPTIVE, colors=8)
AttributeError: 'list' object has no attribute 'convert'
image:
I tried this code:
from PIL import Image
import os
os.chdir('D:\\background')
img=os.listdir()
a=img.convert("P", palette=Image.ADAPTIVE, colors=8)
a.save('D:\\test')
So if I want to convert multiple files with pillow how should I do it?
Check documentation here https://pillow.readthedocs.io/en/stable/reference/Image.html
img=os.listdir(), and img is a list of filenames under the folder 'D:\background'. Here's my implementation:
from PIL import Image
import os
base_dir_src = 'D:\\background'
base_dir_dst = 'D:\\test'
os.chdir()
for filename in os.listdir():
with Image.open(filename) as img:
converted_img = img.convert("P", palette=Image.ADAPTIVE, colors=8)
converted_img.save(os.path.join(base_dir_dst, filename))

Upload an image to a folder in python

Does anybody know how to upload an image (using filedialog.askopenfile) and then storing the uploaded image to an existing folder on my computer?! All the examples available on the internet require image paths, and i get an error whenever i provide the filepath for the uploaded image, am i doing something wrong?
import cv2
import os
from tkinter.filedialog import askopenfile
filename = askopenfile(title ='open', filetypes=(("PNGs", "*.png"),("JPGs", "*.jpg"), ("GIFs", "*.gif")))
img = cv2.imread(filename)
path = "/Users/mac/desktop/test" # => Folder path
cv2.imwrite(os.path.join(path, img)

OpenCV only accepts my path string in PyCharm

When I try to run my code in PyCharm, it exits with code 0, and gives the desired output, but when I try to run it in VS Code it gives the following error:
File "c:\Users\1\Desktop\ImagetoText\ITT2.py", line 21, in <module> img = cv.cvtColor(img, cv.COLOR_BGR2RGB) cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-kh7iq4w7\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
How it is possible that the same code runs without errors or warnings relating to this line in PyCharm while not working in VS Code or directly in W10 is alien to my understanding.
Note: I have tried tweaking the path but to no avail.
Code:
from glob import glob
from io import BytesIO
import pytesseract
import cv2 as cv
from tkinter import *
import pyperclip
import os
presentItem = ImageGrab.grabclipboard()
with BytesIO() as f:
presentItem.save(f, format='PNG')
presentItem.save('tempITT' + '.png', 'PNG')
pytesseract.pytesseract.tesseract_cmd = 'C:\\Users\\1\\AppData\\Local\\Programs\\Tesseract-OCR\\tesseract.exe'
img = cv.imread(r"C:\Users\1\Desktop\ImagetoText\tempITT.png")
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
imgtext = pytesseract.image_to_string(img)
pyperclip.copy(imgtext)
os.remove(r"C:\Users\1\Desktop\ImagetoText\tempITT.png")
Firts check if you really have this image.
C:\Users\1\Desktop\ImagetoText\tempITT.png
imread doesn't show error when it can't find image but it returns None and later code run cv.cvtColor(None, cv.COLOR_BGR2RGB) which gives error with text !_src.empty()
I think all your problem starts with presentItem.save(...) because you use filename without full path - so it may save it in local folder, not in C:\Users\1\Desktop\ImagetoText, and later imread(r'C:\Users\1\Desktop\ImagetoText\...) can't find it.
You should use full path in all functions
presentItem.save(r'C:\Users\1\Desktop\ImagetoText\tempITT.png', 'PNG')
BTW:
When you have code C:\Users\1\Desktop\ImagetoText and you run it from this folder
cd C:\Users\1\Desktop\ImagetoText
python script.py
then presentItem.save("tempITT.png") saves file in this folder C:\Users\1\Desktop\ImagetoText and you have C:\Users\1\Desktop\ImagetoText\tempITT.png,
but if you run code for other folder
cd other folder
python C:\Users\1\Desktop\ImagetoText\script.py
then presentItem.save("tempITT.png") saves file in other foler you have C:\other folder\tempITT.png
And this can happend in your situation. Different tools may runs it in different way and later presentItem.save( may save file in different folder - and you should use full path in presentItem.save()
Folder in which code is executed is called Current Working Directory and you can see it using print( os.getcwd() )

Converting a TIFF Image saved with a transparency can't be converted to JPEG image in Python

I am trying to solve a problem in Python where I am needing to convert TIFF images to JPEGs. I have tried using Pillow as well as OpenCV to do this but keep getting errors when I try to convert a TIFF image that has the transparency saved on it. If I save the TIFF and remove the transparency it saves the JPEG successfully. The transparency has to remain on the TIFF. Does anyone know of a solution for this issue? If I could find a way to even save the TIFF without the transparency via a Python script, save as a JPEG, and then delete the TIFF without the transparency that would work too. Any help here would be greatly appreciated. Below are examples of code I have tried that have failed:
import os
from PIL import Image
os.chdir('S:/DAM/Test/Approved/')
# for root, dirs, files in os.walk('S:/DAM/Test/Approved'):
for root, dirs, files in os.walk('.'):
for name in files:
if name.endswith('.tif'):
filename = os.path.join(root, name)
print('These are the files: ', filename)
# img = Image.open(filename).convert('RGB')
img = Image.open(filename)
print('image is open', filename)
img = img.convert('RGB')
print('image should be converted: ', filename)
imageResize = img.resize((2500, 2500))
print('image should be resized: ', filename)
imageResize.save(filename[:-4]+'.jpg', 'JPEG')
print('image should be saved as a jpeg: ', filename)
Here is the error I get when Python tries to open the TIFF with transparency using Pillow:
Exception has occurred: UnidentifiedImageError
cannot identify image file '.\\Beauty Images\\XXX.tif'
File "U:\Python files\image_conversion2.py", line 22, in <module>
img = Image.open(filename)
When I run this code using OpenCV it fails on the same image as well:
img = cv2.imread('S:/DAM/Test/Approved/Beauty Images/XXX.tif')
cv2.imwrite('S:/DAM/Test/Approved/Beauty Images/XXX.jpg', img)
Here is the error I get with this code:
OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp:715: error: (-215:Assertion failed) !_img.empty() in function 'cv::imwrite'
File "U:\Python files\img_convert_new.py", line 19, in <module>
cv2.imwrite('S:/DAM/Test/Approved/Beauty Images/XXX.tif', img)
Here is how to read a CMYKA TIFF with Python Wand, remove the alpha channel, save it to JPG and also convert the image to OpenCV format.
Input:
from wand.image import Image
from wand.display import display
import numpy as np
import cv2
with Image(filename='guinea_pig.tiff') as img:
display(img)
with img.clone() as img_copy:
# remove alpha channel and save as JPG
img_copy.alpha_channel='off'
img_copy.format = 'jpeg'
img_copy.save(filename='guinea_pig.jpg')
display(img_copy)
# convert to opencv/numpy array format and reverse channels from RGB to BGR for opencv
img_copy.transform_colorspace('srgb')
img_opencv = np.array(img_copy)
img_opencv = cv2.cvtColor(img_opencv, cv2.COLOR_RGB2BGR)
# display result with opencv
cv2.imshow("img_opencv", img_opencv)
cv2.waitKey(0)
Resulting JPG:
Thanks to #cgohlke the solution was found! The solution is as follows using imagecodecs. The fullpath variable is the root + '/' + file of the source path.
for root, subdirs, files in os.walk(src):
for file in files:
fullpath = (root + '/' + file)
from imagecodecs import imread, imwrite
from PIL import Image
imwrite(fullpath[:-4] + '.jpg', imread(fullpath)[:,:,:3].copy()) # <-- using the imagecodecs library function of imread, make a copy in memory of the TIFF File.
# The :3 on the end of the numpy array is stripping the alpha channel from the TIFF file if it has one so it can be easily converted to a JPEG file.
# Once the copy is made the imwrite function is creating a JPEG file from the TIFF file.
# The [:-4] is stripping off the .tif extension from the file and the + '.jpg' is adding the .jpg extension to the newly created JPEG file.
img = Image.open(fullpath[:-4] + '.jpg') # <-- Using the Image.open function from the Pillow library, we are getting the newly created JPEG file and opening it.
img = img.convert('RGB') # <-- Using the convert function we are making sure to convert the JPEG file to RGB color mode.
imageResize = img.resize((2500, 2500)) # <-- Using the resize function we are resizing the JPEG to 2500 x 2500
imageResize.save(fullpath[:-4] + '.jpg') # <-- Using the save function, we are saving the newly sized JPEG file over the original JPEG file initially created.

Load all images from a folder using PIL

import glob
from PIL import Image
marked = glob.iglob("D:/Users/username/Desktop/cells/Marked")
img = Image.open(marked)
img.show()
I am trying to create a neural network using an image dataset contained in the Folder marked. When I run the code I get the error:
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PIL/Image.py", line 2547, in open
fp.seek(0)
AttributeError: 'generator' object has no attribute 'seek'
I do not understand what the error means, it seems to be misdirected?
You'll need to specify a wildcard at the end of your path and iterate:
images = []
for f in glob.iglob("D:/Users/username/Desktop/cells/Marked/*"):
images.append(np.asarray(Image.open(f)))
images = np.array(images)
See this answer, which uses PIL.Image and glob to find all images in the folder and load them into an array.
from PIL import Image
import glob
image_list = []
for filename in glob.glob('yourpath/*.gif'): #assuming gif
im=Image.open(filename)
image_list.append(im)

Categories

Resources