A. python tkinter 无法显示图片
试试这个:
fromTkinterimport*
filename=r"C:UsersAdministratorDesktopa.gif"
root=Tk()
img=PhotoImage(file=filename)
label=Label(root,text="hello",image=img)
label.pack()
root.mainloop()
图片一定要是.gif格式的!!
B. Python 发送多图邮件为什么只显示第一张
首先你在编辑你的网页邮件模板的时候需要(代码自己优化,可以根据图片数量进行判断拼凑,看到你的问题马上想到的简单处理方案)
msgText=MIMEText('<b>Some<i>HTML</i>text</b>andanimage.<br>'
'<imgsrc="cid:image1">'
'<imgsrc="cid:image2">'
'<imgsrc="cid:image3">'
'<br>good!','html','utf-8')
msgRoot.attach(msgText)
然后后面附件要用(我这里比如3个图片,代码可以自己调整)
foriinrange(1,4,1):
fp=open('d:\python_jpg\%i.jpg'%i,'rb')
msgImage=MIMEImage(fp.read())
fp.close()
msgImage.add_header('Content-ID','<image%i>'%i)
msgRoot.attach(msgImage)
完整测试代码如下:
#!/usr/bin/python
#-*-coding:utf-8-*-
__author__='cyc'
__data__='2015/10/20'
#!/usr/bin/envpython3
#coding:utf-8
importsmtplib
fromemail.mime.multipartimportMIMEMultipart
fromemail.mime.textimportMIMEText
fromemail.mime.imageimportMIMEImage
sender='*@163.com'
receiver='*@163.com'
subject='pythonemailtest'
smtpserver='smtp.163.com'
username='*'
password='*'
msgRoot=MIMEMultipart('related')
msgRoot['Subject']='这里是测试图片的发送'
msgText=MIMEText('<b>Some<i>HTML</i>text</b>andanimage.<br>'
'<imgsrc="cid:image1">'
'<imgsrc="cid:image2">'
'<imgsrc="cid:image3">'
'<br>good!','html','utf-8')
msgRoot.attach(msgText)
foriinrange(1,4,1):
fp=open('d:\python_jpg\%i.jpg'%i,'rb')
msgImage=MIMEImage(fp.read())
fp.close()
msgImage.add_header('Content-ID','<image%i>'%i)
msgRoot.attach(msgImage)
smtp=smtplib.SMTP()
smtp.connect('smtp.163.com')
smtp.login(username,password)
smtp.sendmail(sender,receiver,msgRoot.as_string())
smtp.quit()
参考资料
http://www.jb51.net/article/34498.htm
http://www.jb51.net/article/49216.htm
C. python处理图片数据
目录
1.机器是如何存储图像的?
2.在Python中读取图像数据
3.从图像数据中提取特征的方法#1:灰度像素值特征
4.从图像数据中提取特征的方法#2:通道的平均像素值
5.从图像数据中提取特征的方法#3:提取边缘
是一张数字8的图像,仔细观察就会发现,图像是由小方格组成的。这些小方格被称为像素。
但是要注意,人们是以视觉的形式观察图像的,可以轻松区分边缘和颜色,从而识别图片中的内容。然而机器很难做到这一点,它们以数字的形式存储图像。请看下图:
机器以数字矩阵的形式储存图像,矩阵大小取决于任意给定图像的像素数。
假设图像的尺寸为180 x 200或n x m,这些尺寸基本上是图像中的像素数(高x宽)。
这些数字或像素值表示像素的强度或亮度,较小的数字(接近0)表示黑色,较大的数字(接近255)表示白色。通过分析下面的图像,读者就会弄懂到目前为止所学到的知识。
下图的尺寸为22 x 16,读者可以通过计算像素数来验证:
图片源于机器学习应用课程
刚才讨论的例子是黑白图像,如果是生活中更为普遍的彩色呢?你是否认为彩色图像也以2D矩阵的形式存储?
彩色图像通常由多种颜色组成,几乎所有颜色都可以从三原色(红色,绿色和蓝色)生成。
因此,如果是彩色图像,则要用到三个矩阵(或通道)——红、绿、蓝。每个矩阵值介于0到255之间,表示该像素的颜色强度。观察下图来理解这个概念:
图片源于机器学习应用课程
左边有一幅彩色图像(人类可以看到),而在右边,红绿蓝三个颜色通道对应三个矩阵,叠加三个通道以形成彩色图像。
请注意,由于原始矩阵非常大且可视化难度较高,因此这些不是给定图像的原始像素值。此外,还可以用各种其他的格式来存储图像,RGB是最受欢迎的,所以笔者放到这里。读者可以在此处阅读更多关于其他流行格式的信息。
用Python读取图像数据
下面开始将理论知识付诸实践。启动Python并加载图像以观察矩阵:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from skimage.io import imread, imshow
image = imread('image_8_original.png', as_gray=True)
imshow(image)
#checking image shape
image.shape, image
(28,28)
矩阵有784个值,而且这只是整个矩阵的一小部分。用一个LIVE编码窗口,不用离开本文就可以运行上述所有代码并查看结果。
下面来深入探讨本文背后的核心思想,并探索使用像素值作为特征的各种方法。
方法#1:灰度像素值特征
从图像创建特征最简单的方法就是将原始的像素用作单独的特征。
考虑相同的示例,就是上面那张图(数字‘8’),图像尺寸为28×28。
能猜出这张图片的特征数量吗?答案是与像素数相同!也就是有784个。
那么问题来了,如何安排这784个像素作为特征呢?这样,可以简单地依次追加每个像素值从而生成特征向量。如下图所示:
下面来用Python绘制图像,并为该图像创建这些特征:
image = imread('puppy.jpeg', as_gray=True)
image.shape, imshow(image)
(650,450)
该图像尺寸为650×450,因此特征数量应为297,000。可以使用NumPy中的reshape函数生成,在其中指定图像尺寸:
#pixel features
features = np.reshape(image, (660*450))
features.shape, features
(297000,)
array([0.96470588, 0.96470588, 0.96470588, ..., 0.96862745, 0.96470588,
0.96470588])
这里就得到了特征——长度为297,000的一维数组。很简单吧?在实时编码窗口中尝试使用此方法提取特征。
但结果只有一个通道或灰度图像,对于彩色图像是否也可以这样呢?来看看吧!
方法#2:通道的平均像素值
在读取上一节中的图像时,设置了参数‘as_gray = True’,因此在图像中只有一个通道,可以轻松附加像素值。下面删除参数并再次加载图像:
image = imread('puppy.jpeg')
image.shape
(660, 450, 3)
这次,图像尺寸为(660,450,3),其中3为通道数量。可以像之前一样继续创建特征,此时特征数量将是660*450*3 = 891,000。
或者,可以使用另一种方法:
生成一个新矩阵,这个矩阵具有来自三个通道的像素平均值,而不是分别使用三个通道中的像素值。
下图可以让读者更清楚地了解这一思路:
这样一来,特征数量保持不变,并且还能考虑来自图像全部三个通道的像素值。
image = imread('puppy.jpeg')
feature_matrix = np.zeros((660,450))
feature_matrix.shape
(660, 450)
现有一个尺寸为(660×450×3)的三维矩阵,其中660为高度,450为宽度,3是通道数。为获取平均像素值,要使用for循环:
for i in range(0,iimage.shape[0]):
for j in range(0,image.shape[1]):
feature_matrix[i][j] = ((int(image[i,j,0]) + int(image[i,j,1]) + int(image[i,j,2]))/3)
新矩阵具有相同的高度和宽度,但只有一个通道。现在,可以按照与上一节相同的步骤进行操作。依次附加像素值以获得一维数组:
features = np.reshape(feature_matrix, (660*450))
features.shape
(297000,)
方法#3:提取边缘特征
请思考,在下图中,如何识别其中存在的对象:
识别出图中的对象很容易——狗、汽车、还有猫,那么在区分的时候要考虑哪些特征呢?形状是一个重要因素,其次是颜色,或者大小。如果机器也能像这样识别形状会怎么样?
类似的想法是提取边缘作为特征并将其作为模型的输入。稍微考虑一下,要如何识别图像中的边缘呢?边缘一般都是颜色急剧变化的地方,请看下图:
笔者在这里突出了两个边缘。这两处边缘之所以可以被识别是因为在图中,可以分别看到颜色从白色变为棕色,或者由棕色变为黑色。如你所知,图像以数字的形式表示,因此就要寻找哪些像素值发生了剧烈变化。
假设图像矩阵如下:
图片源于机器学习应用课程
该像素两侧的像素值差异很大,于是可以得出结论,该像素处存在显着的转变,因此其为边缘。现在问题又来了,是否一定要手动执行此步骤?
当然不!有各种可用于突出显示图像边缘的内核,刚才讨论的方法也可以使用Prewitt内核(在x方向上)来实现。以下是Prewitt内核:
获取所选像素周围的值,并将其与所选内核(Prewitt内核)相乘,然后可以添加结果值以获得最终值。由于±1已经分别存在于两列之中,因此添加这些值就相当于获取差异。
还有其他各种内核,下面是四种最常用的内核:
图片源于机器学习应用课程
现在回到笔记本,为同一图像生成边缘特征:
#importing the required libraries
import numpy as np
from skimage.io import imread, imshow
from skimage.filters import prewitt_h,prewitt_v
import matplotlib.pyplot as plt
%matplotlib inline
#reading the image
image = imread('puppy.jpeg',as_gray=True)
#calculating horizontal edges using prewitt kernel
edges_prewitt_horizontal = prewitt_h(image)
#calculating vertical edges using prewitt kernel
edges_prewitt_vertical = prewitt_v(image)
imshow(edges_prewitt_vertical, cmap='gray')
D. 如何在python界面显示图片
wxpython:
# 使用wx.Image得到对象
bmp = wx.Image('bitmaps/image.bmp', wx.BITMAP_TYPE_BMP).ConvertToBitmap()
gif = wx.Image('bitmaps/image.gif', wx.BITMAP_TYPE_GIF).ConvertToBitmap()
png = wx.Image('bitmaps/image.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()
jpg = wx.Image('bitmaps/image.jpg', wx.BITMAP_TYPE_JPEG).ConvertToBitmap()
# 把它们显示出来
pos = 10
wx.StaticBitmap(frame, -1, bmp, (10, pos), (bmp.GetWidth(), bmp.GetHeight()))
pos = pos + bmp.GetHeight() + 10
wx.StaticBitmap(frame, -1, gif, (10, pos), (gif.GetWidth(), gif.GetHeight()))
pos = pos + gif.GetHeight() + 10
wx.StaticBitmap(panel, -1, png, (10, pos), (png.GetWidth(), png.GetHeight()))
pos = pos + png.GetHeight() + 10
wx.StaticBitmap(frame, -1, jpg, (10, pos), (jpg.GetWidth(), jpg.GetHeight()))
具体的请根据你的实际情况修改,最好去http://www.wxpython.org/download.php#binaries
下载wxpython和wxpython demo看看,这个demo很强大的。
E. pythonopencv图片显示到另一个显示器
不是很明白题目的意思,是一个窗口显示多张图么?可以先开辟一个大的图像(大小是所有小图的和),然后根据你要显示的图像大小和位置分别设置ROI,把小图进去。最后释放ROI把大图显示出来
F. 在python Image中可以用show()来显示图片,但是显示以后,下面的代码就不运行了,如何运行下面的代码
Image.show()函数是这个样子的,必须先关了图片程序才往下走。
不使用show,如imshow(BW)在 Matlab 7.0 中,二进制图像是一个逻辑类,仅包括 0 和 1 两个数值。像素 0 显示为黑色,像素 1 显示为白色。显示时,也可通过NOT(~)命令,对二进制图象进行取反,使数值 0 显示为白色;1 显示为黑色。
例如: imshow(~BW)
扩展资料:
不使用show函数来满足运行的需求:
import threading
import Image
class ThreadClass(threading.Thread):
def run(self):
im=Image.open('z.jpg')
im.show()
print (1)
t = ThreadClass()
t.start()
print (2)
a=input('End')
#===============================
图像的表示原理:
最基本的物理图像是根据矩形网格抽样原理从连续图像域中抽取二维灰度阵列(矩阵)得到的。也可以用长向量表示二维灰度矩阵,它是按列(或行)扫描灰度矩阵,把下一列(或行)的头和前一列(或行)的尾相接而成。
它们的线性可逆变换同样可以用来表示图像。图像的每一行由行程(具有同一灰度的邻近像元集合)序列所组成,因此也可以用行程长度编码(见图像编码)表示图像。
G. Python3 打开一张网络图片
不要用io.StringIO,改用io.BytesIO
H. 怎么用python显示一张图片
用python显示一张图片方法如下:
import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片
import numpy as nplena = mpimg.imread('lena.png') # 读取和代码处于同一目录下的 lena.png# 此时 lena 就已经是一个 np.array 了,可以对它进行任意处理
lena.shape #(512, 512, 3)plt.imshow(lena) # 显示图片plt.axis('off') # 不显示坐标轴
plt.show()
I. python一个显示图片的问题
第五行那个括号里改为:file=r‘C:\WPython27’试试。。。