import scipy
import numpy as np
from scipy import linalg
print("number of items in numpy.linalg:", len(dir(np.linalg)))
print ("number of items in scipy.linalg:", len(dir(scipy.linalg)))#scipy有更多模块和功能
注:linalg = linear(线性)+ algebra(代数)
02-矩阵求逆#利用linalg.inv求逆 import scipy import numpy as np from scipy import linalg A = np.array([[5,0],[0,10]]) A_=linalg.inv(A) print(A_) #验证矩阵与其逆矩阵相乘是否为E print(np.dot(A,A_))03-矩阵相乘
#利用np.dot求矩阵的乘积 import numpy as np a=np.array([[1,2,3],[4,5,6],[7,8,9]]) e=np.array([[1],[1],[1]]) c=np.dot(a,e) print(c)04-方程组求解
#利用scipy.linalg.solve求解函数,求解方程组 from scipy import linalg import numpy as np #声明numpy数组 a = np.array([[1,0,0], [0,2,0], [0,0,3]]) b = np.array([1,8,15]) #求解 x = linalg.solve(a,b) #输出解 print (x)05-行列式求解
#利用numpy.linalg.det求行列式 import numpy as np A=np.array([[1,2,3],[4,5,6],[7,8,9]]) print(np.linalg.det(A))06-特征值和特征向量求解
#求解特征值和特征向量
from scipy import linalg
import numpy as np
#声明numpy数组
A = np.array([[1,0],[0,1]])
#求解
m,n= linalg.eig(A)
#打印特征值
print('特征值')
print (m)
#打印特征向量
print('特征向量')
print (n)
07-图像处理中的应用
01、图像导入
# 导入图像处理的第三方库
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
# 读取图像
im = Image.open('./images/example.jpg')
#输出图像的维数
print("图像的维数:",np.array(im).shape)
# 显示图像
plt.imshow(im)
plt.show()
输出:
图像的维数: (731, 991, 3)02、图像分辨率调整
#调整图像(像素)大小 im = im.resize((28, 28), Image.ANTIALIAS)#Image.ANTIALIAS:高质量 plt.imshow(im) plt.show() print(np.array(im).shape)#输出图像的维数
输出:
(28, 28, 3)03、图像变形
# 导入图像处理的第三方库
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
# 读取图像
im = Image.open('./images/example.jpg')
im = im.resize((100,100), Image.ANTIALIAS)#Image.ANTIALIAS:高质量
#输出图像的维数
print(np.array(im).shape)
plt.imshow(im)
plt.show()
plt.imshow(np.array(im).reshape(50,200,3))
plt.show()
plt.imshow(np.array(im).reshape(200,50,3))
plt.show()
输出:
(100, 100, 3)
# 导入图像处理的第三方库
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
# 读取图像
im = np.array(Image.open('./images/example.jpg').convert('L'))
# print (int(im.min()), int(im.max()))#查看图像中的最小和最大像素值
# 对图像进行反相处理
im2 = 255 - im
# 将图像像素值变换到100...200 区间
im3 = (100.0/255) * im + 100
# 对图像像素值求平方后得到的图像
im4 = 255.0 * (im/255.0)**2
print("对图像进行反相处理后得到的图像")
plt.imshow(im2)
plt.show()
print("将图像像素值变换到100...200 区间")
plt.imshow(im3)
plt.show()
print("对图像像素值求平方后得到的图像")
plt.imshow(im4)
plt.show()
输出:
对图像进行反相处理后得到的图像
将图像像素值变换到100...200 区间
对图像像素值求平方后得到的图像05、对图像求逆
#利用linalg.inv求逆
import scipy
import numpy as np
from scipy import linalg
# 导入图像处理的第三方库
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
# 读取图像
im = Image.open('./images/example.jpg')
#调整图像(像素)大小
im = im.resize((10,30), Image.ANTIALIAS)#Image.ANTIALIAS:高质量
print(im)
plt.imshow(im)
plt.show()
im=np.reshape(im,(30,30))
plt.imshow(im)
plt.show()
# 显示图像
new_im=linalg.inv(im)
plt.imshow(new_im)
plt.show()
结果:
#将不同模式的图片打印出shape 和 [0, 0]像素点的值
from PIL import Image
import matplotlib.pyplot as plt
image = Image.open('./images/example.jpg') # 本地一个文件
mode_list = ['1', 'L', 'I', 'F', 'P', 'RGB', 'RGBA', 'CMYK', 'YCbCr' ]
for mode in mode_list:
img = image.convert(mode)
img_data = np.array(img)
print('img_{:>1}.shape: {}' .format(mode, img_data.shape))
print('img_{:>}_data[0, 0]: {}'.format(mode, img_data[0, 0]))
print('---')
plt.imshow(img)
plt.show(img)
07、图像相乘
#导入图像处理的第三方库
import matplotlib.pyplot as plt
from scipy import linalg
from PIL import Image
import numpy as np
#读取图像
im = Image.open('./images/example.jpg')
#设置图像类型
im=im.convert("1")
#调整图像(像素)大小
im = im.resize((300,300), Image.ANTIALIAS)#Image.ANTIALIAS:高质量
#显示图像
im=np.reshape(im,(300,300))
print("原图像:")
plt.imshow(im)
plt.show()
#求解图像的逆矩阵图像
new_im=linalg.inv(im) #求矩阵的逆
print("原图像的逆矩阵图像:")
plt.imshow(new_im)
plt.show()
#验证并显示原图像矩阵与其逆矩阵的乘积是否为单位阵
E=np.dot(im,new_im)
print("显示单位矩阵图像:")
plt.imshow(E)
plt.show()
#测试
im=np.resize(im,(30,30))
new_im=np.resize(new_im,(30,30))
new_E=np.dot(im,new_im)
print("显示图像相乘结果:")
plt.imshow(im)
plt.show()
plt.imshow(new_im)
plt.show()
plt.imshow(new_E)
plt.show()
输出:
原图像:
原图像的逆矩阵图像:
显示单位矩阵图像:
显示图像相乘结果:
#利用卷积操作实现边缘提取
import numpy as np
import matplotlib.image as mpimg
from PIL import Image
def compute_conv(fm, kernel):
[h, w] = fm.shape
k = 3
r = int(k / 2)
padding_fm = np.zeros([h + 2, w + 2]) # , np.int)
rs = np.zeros([h, w]) # , np.int)
padding_fm[1:h + 1, 1:w + 1] = fm
for i in range(1, h + 1):
for j in range(1, w + 1):
i0 = i - r
i1 = i + r + 1
j0 = j - r
j1 = j + r + 1
roi = padding_fm[i0:i1, j0:j1]
rs[i - 1][j - 1] = np.sum(roi * kernel)
return rs
# 定义卷积核
def kernel_i():
weights_data = [
[1,0,-1],
[1,0,-1],
[1,0,-1]
]
weights = np.asarray(weights_data) # , np.int)
return weights
def main():
for i in range(c):
l1 = temp[:, :, i]
input = np.asarray(l1) # , np.int)
weights = kernel_i() # 获取卷积核
rs = compute_conv(input, weights) # 卷积计算
arr[:, :, i] = rs # 把卷积后的结果传给新的数组
# 把卷积后的结果保存为图片
arr01 = np.array(arr, dtype=np.uint8)
image = Image.fromarray(arr01, 'RGB')
image.save('./images/example_save3.jpg')
# np.savetxt('D:/%d.txt' % (i+1), arr) # 把每一个维度的矩阵分别保存为一个txt文本
# image.show()
img = mpimg.imread("./images/example.jpg")
temp = np.asarray(img) # , np.int)
[h, w, c] = temp.shape
arr = np.zeros((h, w, c), int)
main()
结果:



