Can't load images directory in Colab - python

I have imported the zip files for the said directories, but every time I try to visualize the images with a random number I am getting the following error:
error: OpenCV(4.1.2) /io/opencv/modules/imgproc/src/color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cvtColor'
The code I use:
img = imread_collection(os.path.join(self.img_dir, self.img_IDs[i]))
#img = cv2.imread()
img = cv2.cvtColor(np.float32(img), cv2.COLOR_BGR2RGB)

The error means that you not have read the image(s).
To read an image you need to have following lines of code:
img = cv2.imread('./some path to image/image.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
Can your function read images like the standard opencv imread module?
Can you show us the content of this function?
imread_collection(os.path.join(self.img_dir, self.img_IDs[i]))
You could print the result of os.path to see if the folder is without any errors in name:
print( os.path.join(self.img_dir, self.img_IDs[i]) )
Don't forget to mount the drive:
from google.colab import drive
drive.mount('/content/drive')

Related

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.

Problem with Python Script that converts images to video after creating EXE with pyinstaller

I wanted to make a script that will convert images stored in a folder to video.
Here's the code:
import cv2
import numpy as np
import os
import pyautogui
import msvcrt
imageFolder = input('Please enter images folder path: ').replace(chr(34),"")
outputPath = imageFolder+'\Video.avi'
try:
images = [img for img in os.listdir(imageFolder) if img.endswith(".jpg")]
while len(images)==0:
imageFolder = input('There are no images in the directory ! Please enter images folder path: ').replace(chr(34),"")
images = [img for img in os.listdir(imageFolder) if img.endswith(".jpg")]
print('Creating recording...')
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
frame = cv2.imread(os.path.join(imageFolder, images[0]))
height, width, layers = frame.shape
frameRate = 2
video = cv2.VideoWriter(outputPath, fourcc, frameRate, (width,height))
for image in images:
print(f'{int((images.index(image)/len(images))*100)} %', end="\r")
video.write(cv2.imread(os.path.join(imageFolder, image)))
cv2.destroyAllWindows()
video.release()
decision = input('Recording has been created successfully ! Do you want to open it? [Y/N]: ')
if decision.lower() == 'y':
print('Opening file...')
os.startfile(outputPath)
except:
print(f'There was a problem with creating a recording. Check images path: {imageFolder}')
The code works fine when I'm launching that from command line, but after converting that to EXE with pyinstalller (pyinstaller -F ConvertToRecording.py) I'm getting an error like this:
[ERROR:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap.cpp (3
92) cv::VideoWriter::open VIDEOIO(CV_IMAGES): raised OpenCV exception:
OpenCV(4.1.1) C:\projects\opencv-python\opencv\modules\videoio\src\cap_images.cp
p:253: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the n
ame of file): C:\Users\MyUser\Documents\Test\20191018_12_45\Video.avi in function
'cv::icvExtractPattern'
Any help appreciated !
I met the same problem. Just go to your OpenCV folder (if you don't have, go here: https://opencv.org/releases/) and find the opencv_videoio_ffmpeg420_64.dll ( I am using 4.20) file. copy it and paste it to your exe direction (same folder).
Then it will work.
Use the os.path module to with paths instead of concatenating strings. This ensures a better cross-platform compatibility. See the manual for a more elaborate explanation of the module.

openCV error: can't found the images .jpg

for f, tags in tqdm(df_test.values, miniters=1000):
img = cv2.imread('input/test-jpg/{}.jpg'.format(f), -1)
x_test.append(cv2.resize(img, (img_size, img_size)))
x_test = np.array(x_test, np.float32)/255.
When i run the above code I get this error:
error: OpenCV(3.4.3)
C:\projects\opencv-python\opencv\modules\imgproc\src\resize.cpp:4044:
error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'
but the files there are in the directory and the path is rigth
Make sure your input folder is located on the same level as your .py file. Otherwise, use abolute paths.
Also try the following to find your current working directory:
import os
os.getcwd()
check what is inside img after you do cv2.imread..

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