Image GUI sourced from Internet Python - python

I am trying to display an image from a Url however i am not sure how to do so.
Below is my attempt:
imageFile = "http://photo.elsoar.com/wp-content/images/Personal-computer.jpg"
image1 =PhotoImage(open(imageFile))
image1.grid(row=1, column=5)
This just produces an error
Traceback (most recent call last):
File "C:\Users\Derren\Desktop\Online Shopper.py", line 131, in <module>
image1 =PhotoImage(open(imageFile))
IOError: [Errno 22] invalid mode ('r') or filename: 'http://photo.elsoar.com/wp-content/images/Personal-computer.jpg'
This is the image i want to have
http://photo.elsoar.com/wp-content/images/Personal-computer.jpg
However it is essential that it is resourced from the internet and not local files

The function open() only works on locals files. You can see doc here part 7.2. If you want to work with an online image, you can use this :
from PIL import Image
import requests
from io import BytesIO
response = requests.get("url")
img = Image.open(BytesIO(response.content))
img.save("my_img.png") #with the good filename extension

If you particularly want a PhotoImage based solution that this should work:
import urllib
f = urllib.urlopen("http://photo.elsoar.com/wp-content/images/Personal-computer.jpg")
data=f.read()
root = Tkinter.Tk()
image1 =PhotoImage(data)

Related

How to cv2.imread an image within a zipfile?

I'm trying to use OpenCV2 to read images withing a zipfile with cv2.imread and then resize them and save them but I can't figure out how to read those images within the zipfile. This is my code so far:
import cv2
from zipfile import ZipFile
with ZipFile("sample_images.zip", "r") as zipFile:
imgs = zipFile.namelist()
img = zipFile.open(imgs[0])
processedImg = cv2.imread(img)
This is the error I get:
Traceback (most recent call last):
File "C:/Users/Yash/Desktop/Programming/opencv test/test.py", line 8, in <module>
processedImg = cv2.imread(img)
SystemError: <built-in function imread> returned NULL without setting an error
Try this
from io import BytesIO
from zipfile import ZipFile
from PIL import Image
with ZipFile("sample_images.zip", "r") as zipFile:
imgs = zipFile.namelist()
print(imgs[0])
img = zipFile.read(imgs[0])
processedImg = Image.open(BytesIO(img))
processedImg.show()

OSError: cannot identify image file 'file_name'

I have already read answer of this question Image.open() cannot identify image file - Python?, that question was solved by using from PIL import Image, but my situation is different. I am using image_slicer, and there I am getting these errors:
Traceback (most recent call last):
File "image_slice.py", line 17, in <module>
j=image_slicer.slice('file_name' , n_k)
File "/home/user_name/.local/lib/python3.5/site-
packages/image_slicer/main.py", line 114, in slice
im = Image.open(filename)
File "/home/user_name/.local/lib/python3.5/site-packages/PIL/Image.py", line 2687, in open
% (filename if filename else fp))
OSError: cannot identify image file 'file_name'
The full code is:
import os
from PIL import Image
import image_slicer
import numpy as np
import nibabel as nib
img = nib.load('/home/user_name/volume-20.nii')
img.shape
epi_img_data = img.get_data()
#epi_img_data.shape
n_i, n_j, n_k = epi_img_data.shape
center_i = (n_i - 1) // 2
center_j = (n_j - 1) // 2
center_k = (n_k - 1) // 2
centers = [center_i, center_j, center_k]
print("Co-ordinates in the voxel array: ", centers)
#for i in range(n_k):
j=image_slicer.slice('/home/user_name/volume-20.nii' , n_k)
However nib.load(), works fine, but image_slicer is not working.
All the nii images are 3D images.
Image slicer is not intended for reading nii format. Here is the list of supported formats.
This error also occurs whenever the image file itself is corrupted. I once accidentally was in the process of deleting the subject image, until canceling mid-way through.
TL;DR - open image file to see if it's ok.

Python Image to Text

i'm trying to write a python script that will take an image as an input and print out whatever is in the image as text to the terminal or a file. i do have python 2.7 and 3.7
i do have PIL and pytesseract install on my Kali linux
but i'm getting this errors
Traceback (most recent call last):
File "imgtotxt.py", line 8, in <module>
img =Image.open("/home/Desktop/ITT/1.jpeg")
File "/usr/lib/python3/dist-packages/PIL/Image.py", line 2609, in open
fp = builtins.open(filename, "rb")
FileNotFoundError: [Errno 2] No such file or directory: '/home/Desktop/ITT/1.jpeg'
HERE IS MY CODE
#!/usr/bin/python
from PIL import Image
from pytesseract import image_to_string
img =Image.open("/home/Desktop/ITT/1.jpeg")
text =image_to_string(img)
print (text)
Something is wrong with how you typed the filename.
Try this in your python code:
import os
print(os.listdir("/home/Desktop/ITT/"))
You should see your filename printed. Copy the filename from there instead.
If this fails, go up a directory (eg /home/Desktop) and try that.
Make sure if the file exists at the exact location you specified. The system isn't finding the file. Perhaps it's at /home/YOUR_USER/Desktop/ITT/1.jpeg ?
Put the script in the same folder as is the image, change path to only a name of the image and you will se if something is REALLY wrong.
EDIT:
Try this then:
import cv2
import numpy as np
image = cv2.imread('1.jpeg') # alternativly /home/Desktop/ITT/
img = Image.fromarray(image.astype(np.uint8))
....
Also check if your image is not corrupted. This is pretty strange

Python PyMuPDF Fitz insertImage

Have been trying to put an image into a PDF file using PyMuPDF / Fitz and everywhere I look on the internet I get the same syntax, but when I use it I'm getting a runtime error.
>>> doc = fitz.open("NewPDF.pdf")
>>> page = doc[1]
>>> rect = fitz.Rect(0,0,880,1080)
>>> page.insertImage(rect, filename = "Image01.jpg")
error: object is not a stream
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\fitz\fitz.py", line 1225, in insertImage
return _fitz.Page_insertImage(self, rect, filename, pixmap, overlay)
RuntimeError: object is not a stream
>>> page
page 1 of NewPDF.pdf
I've tried a few different variations on this, with pixmap and without, with overlay value set, and without. The PDF file exists and can be opened with Adobe Acrobat Reader, and the image file exists - I have tried PNG and JPG.
Thank you in advanced for any help.
just some hints to attempt:
Ensure that your "Image01.jpg" file is open and use the full path.
image_path = "/full/path/to/Image01.jpg"
image_file = Image.open(
open(image_path, 'rb'))
# side-note: generally it is better to use the open with syntax, see link below
# https://stackoverflow.com/questions/9282967/how-to-open-a-file-using-the-open-with-statement
To ensure that you are actually on the pdf page that you expect to be, try this. This code will insert the image only on the first page
for page in doc:
page.InsertImage(rect, filename=image_path)
break # Without this, the image will appear on each page of your pdf

"ValueError: cannot filter palette images" during Pytesseract Conversion

Having trouble with this error code regarding the following code for Pytesseract. (Python 3.6.1, Mac OSX)
import pytesseract
import requests
from PIL import Image
from PIL import ImageFilter
from io import StringIO, BytesIO
def process_image(url):
image = _get_image(url)
image.filter(ImageFilter.SHARPEN)
return pytesseract.image_to_string(image)
def _get_image(url):
r = requests.get(url)
s = BytesIO(r.content)
img = Image.open(s)
return img
process_image("https://www.prepressure.com/images/fonts_sample_ocra_medium.png")
Error:
/usr/local/Cellar/python3/3.6.0_1/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/g/pyfo/reddit/ocr.py
Traceback (most recent call last):
File "/Users/g/pyfo/reddit/ocr.py", line 20, in <module>
process_image("https://www.prepressure.com/images/fonts_sample_ocra_medium.png")
File "/Users/g/pyfo/reddit/ocr.py", line 10, in process_image
image.filter(ImageFilter.SHARPEN)
File "/usr/local/lib/python3.6/site-packages/PIL/Image.py", line 1094, in filter
return self._new(filter.filter(self.im))
File "/usr/local/lib/python3.6/site-packages/PIL/ImageFilter.py", line 53, in filter
raise ValueError("cannot filter palette images")
ValueError: cannot filter palette images
Process finished with exit code 1
Seems simple enough, but is not working. Any help would be greatly appreciated.
The image you have is a pallet-based image. You need to convert it to a full RGB image in order to use the PIL filters.
import pytesseract
import requests
from PIL import Image, ImageFilter
from io import StringIO, BytesIO
def process_image(url):
image = _get_image(url)
image = image.convert('RGB')
image = image.filter(ImageFilter.SHARPEN)
return pytesseract.image_to_string(image)
def _get_image(url):
r = requests.get(url)
s = BytesIO(r.content)
img = Image.open(s)
return img
process_image("https://www.prepressure.com/images/fonts_sample_ocra_medium.png")
You should also note that the the .convert() and .filter() methods return a copy of the image, they don't change the existing image object. You need to assign the return value to a variable as shown in the code above.
NOTE: I don't have pytesseract, so I can't check the last line of process_image().

Categories

Resources