PIL:Pythonの画像処理ライブラリ
- グレー、読書、保存します。
from PIL import Image
# 打开一个图像,注意是当前路径:
im = Image.open('1.png')
# 灰度化处理
im = Image.open('1.png').convert('L')
# 保存灰度图像:
im.save('2.png')
私たちはインポート
Image
でモジュールPythonの学習モジュールを、私たちは、これはの名前を取得することを知っているImage
オブジェクトを、オブジェクトがモジュールIMなどの定数、および他のいくつかのメソッドが含まれています。我々はなしイムへの直接アクセス、持っている場合はImage
接頭辞を何が起こるでしょうか?プログラムの「NameError」と呼ばれるエラーがスローされます。私たちは、このメソッドから使用することができます。この時間は、このメソッドを直接IM達成するために使用することができます。スクリプトではなく、モジュールを介して直接コピーした後、変数名を使用することができますように、それは、別のスコープに変数名からコピーされます。
- バッチ画像フォーマット変換
from PIL import Image
import os
def get_imlist(path):#获取文件名列表
return [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.png')]#读取png
filelist=get_imlist('C:/Users/Huawei/Desktop/EXP2/image')#建立一个列表对象
#print(filelist)
for infile in filelist:
outfile = os.path.splitext(infile)[0] + ".jpg"#保存为jpg
if infile != outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print("cannot convert", infile)
ファイルパスの区切り文字であることに注意/
唯一の文字列は、ファイル名やファイルパス、二重引用符である単一引用符です
- サムネイルを作成します
from PIL import Image
# 打开一个当前路径的图像:
im = Image.open('1.png')
im.thumbnail((128,128))
# 保存缩略图:
im.save('3.png')
- コピー&ペースト
from PIL import Image
# 打开一个当前路径的图像:
im = Image.open('1.png')
# 裁剪
box = (100,100,400,400)
region = im.crop(box)
# 旋转180度
region = region.transpose(Image.ROTATE_180)
# 粘贴
im.paste(region,box)
# 保存:
im.save('4.png')
- サイズ変更や回転
from PIL import Image
# 打开一个当前路径的图像:
im = Image.open('1.png')
# 调整尺寸
im = im.resize((128,128))
# 旋转
im = im.rotate(45)
# 保存:
im.save('5.png')
matplotlibの
画像、点や線を描画します
from PIL import Image
from pylab import *
im = Image.open('1.png')
# 绘制图像
imshow(im)#没有imshow(),show()将无法显示原图
axis('off')#不显示坐标轴
# x是横坐标,y是纵坐标:(100,200)(100,500)...
x = [100,100,400,400]
y = [200,500,600,800]
#绘制点或线
plot(x,y) # 默认为蓝色实线
plot(x,y,'r*') # 红色星状标记
plot(x,y,'go-') # 带有圆圈标记的绿线
plot(x,y,'ks:') # 带有正方形标记的黑色虚线
# 绘制连接前两个点的线
plot(x[:2],y[:2])#what?
# 添加标题
title('Plotting: "1.png"')
# 原图及绘制的点、线输出到屏幕
show()
表1-1:PyLab
コマンドの形式の基本的なカラー描画ライブラリ
カラー |
|
---|---|
|
ブルー |
|
グリーン |
|
赤 |
|
青色 |
|
マゼンタ |
|
黄色 |
|
黒 |
|
白 |
表1-2:PyLab
コマンドライン形式の基本的な描画ライブラリ
リニア |
|
---|---|
|
実線 |
|
点線 |
|
点線 |
表1-3:PyLab
基本的な描画コマンド形式のタグライブラリの描画
マーク |
|
---|---|
|
ポイント |
|
円 |
|
広場 |
|
スター |
|
プラス |
|
十字架 |
画像の輪郭とヒストグラム
from PIL import Image
from pylab import *
# 读取图像到数组中,一定要读进数组,array(),否则无法绘制直方图(flatten)
im = array(Image.open('1.png').convert('L'))
# 新建一个图像
figure()
# 不使用颜色信息,灰度化
gray()
# 在原点的左上角显示轮廓图像
contour(im, origin='image')
# 坐标
axis('equal')
axis('off')
# 新建一个图像
figure()
# 图像的直方图可以使用 hist() 函数绘制
hist(im.flatten(),128)
show()
hist()
入力としてのみ一次元配列を受け入れ、私たちは、画像ヒストグラムを描画する前に、画像は、プロセスを平坦化する必要があります。
flatten()
任意の一次元アレイの方法は、行の優先度基準の配列に変換されます。
インタラクティブなラベル付け
from PIL import Image
from pylab import *
im = Image.open('1.png')
#显示图片到屏幕
imshow(im)
print('Please click 3 points')
x = ginput(3)
print('you clicked:',x)
show()#这个show()貌似没有用
画像の配列表現
画像がロードされると、私たちを呼び出すことによって
array()
メソッドに画像を変換するNumPy
オブジェクトの配列の
from PIL import Image
from pylab import *
im = array(Image.open('1.png'))
print (im.shape, im.dtype)
im = array(Image.open('1.png').convert('L'),'f')
print (im.shape, im.dtype)
最初のタプルは、各ラインのデータ型は配列要素の文字列表現に続く画像アレイ(行、列、カラーチャンネル)の大きさを表します。画像はしばしば、符号なし整数として8(UINT8)を符号化された第1の場合と、アレイに画像に変換されるので、アレイは、データタイプ「UINT8」です。後者の場合、画像は、グレースケール処理、および「F」追加のパラメータを使用するアレイを作成あるパラメータは、浮動小数点データ型に変換されます。
複数の配列要素は、スライス方式のアレイを使用してアクセスすることができます。スライス方法の復帰は、アレイに指定された間隔のインデックス付きアクセスの要素の値に基づいています。ここでは、グレースケール画像についてのいくつかの例は以下のとおりです。
im[i,:] = im[j,:] # 将第 j 行的数值赋值给第 i 行
im[:,i] = 100 # 将第 i 列的所有数值设为100
im[:100,:50].sum() # 计算前100 行、前 50 列所有数值的和
im[50:100,50:100] # 50~100 行,50~100 列(不包括第 100 行和第 100 列)
im[i].mean() # 第 i 行所有数值的平均值
im[:,-1] # 最后一列
im[-2,:] (or im[-2]) # 倒数第二行
グレースケール変換
読み込まれた画像
NumPy
配列オブジェクトは、我々は彼らの上に任意の数学演算を実行することができます。
from PIL import Image
from pylab import *#imshow()show()
from numpy import *
im = array(Image.open('1.png').convert('L'))
im2 = 255 - im # 对图像进行反相处理
im3 = (100.0/255) * im + 100 # 将图像像素值变换到100...200 区间
im4 = 255.0 * (im/255.0)**2 # 对图像像素值求平方后得到的图像
imshow(im)
show()
imshow(im2)
show()
imshow(im3)
show()
imshow(im4)
show()
print (int(im.min()), int(im.max()))查看最小/最大 灰度值
ヒストグラム平坦化
from PIL import Image
from pylab import *
def histeq(im,nbr_bins=256):
""" 对一幅灰度图像进行直方图均衡化"""
# 计算图像的直方图
imhist,bins = histogram(im.flatten(),nbr_bins,normed=True)
cdf = imhist.cumsum() # cumulative distribution function
cdf = 255 * cdf / cdf[-1] # 归一化
# 使用累积分布函数的线性插值,计算新的像素值
im2 = interp(im.flatten(),bins[:-1],cdf)
return im2.reshape(im.shape), cdf
im = array(Image.open('1.png').convert('L')) # 打开图像,并转成灰度图像
im2, cdf = histeq(im)
figure()
subplot(2, 2, 1)
axis('off')
gray()
title(u'Origin')
imshow(im)
subplot(2, 2, 2)
axis('off')
title(u'Processed')
imshow(im2)
subplot(2, 2, 3)
axis('off')
title(u'Origin Graph')
hist(im.flatten(), 128, normed=True)
subplot(2, 2, 4)
axis('off')
title(u'Processed Graph')
hist(im2.flatten(), 128, normed=True)
show()
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
title(u'原始图像', fontproperties=font)
平均画像
from PIL import Image
from pylab import *#imshow()show()
from numpy import *
import os
def get_imlist(path):#获取文件名列表
return [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.png')]#读取png
def compute_average(imlist):
""" 计算图像列表的平均图像"""
# 打开第一幅图像,将其存储在浮点型数组中
averageim = array(Image.open(imlist[0]), 'f')
for imname in imlist[1:]:
try:
averageim += array(Image.open(imname))
except:
print (imname + '...skipped')
averageim /= len(imlist)
# 返回uint8 类型的平均图像
return array(averageim, 'uint8')
filelist = get_imlist('C:/Users/Huawei/Desktop/EXP2/image')
avg = compute_average(filelist)
for impath in filelist:
im1 = array(Image.open(impath))
subplot(2, 2, filelist.index(impath)+1)
imshow(im1)
imNum=str(filelist.index(impath)+1)
title(u'Origin'+imNum)
axis('off')
subplot(2, 2, 4)
imshow(avg)
title(u'Processed')
axis('off')
show()
未解決の警告があります。