在学习《Coding the Matrix》的时候,了解到了矩阵变换在图像中的应用,先分享coursera的视频
链接:http://pan.baidu.com/s/1c23ZKzA 密码:yasi
该门课程的代码在下列网站提供:
因为刚学第一课,这里记录一下。关于矩阵变换网上有好多博文介绍,这里就只是通过python实现一下效果,也让我们可以感性地感受一下矩阵变换在图像处理的应用。
教程提供了image,plotting模块,也就是从上面的网站下载,因为image模块需要png模块,同样需要下载png.py,还有程序使用的图片也是教程提供的img01.png,所以需要在上述网站下载image.py
,png.py
,plotting
,img01.png
。
因为plotting模块的plot功能是打开浏览器绘图的,这里我重新使用matplotlib的绘图函数scatter
写了一遍。而且载入图像使用了opencv,并没有使用教程提供的image,但也写了代码。
'''
利用matplotlib.pyplot的scatter绘制复平面,首先将复数的实部和虚部提取出来
'''
import numpy as np
import matplotlib.pyplot as plt
import cv2
import os
# 导入image的模块前要切换到image.py所在的路径,同时保证有png.py,另外程序测试用的图片也是网站上的下载的img01.png
os.chdir("d:\\FirefoxDownload")
from image import *
import plotting #导入模块plotting
### 使用image.py和plotting.py
I = color2gray(file2image('img01.png'))
r = len(I)
c = len(I[0])
M=[x+y*1j for x in range(c) for y in range(r) if I[r-y-1][x]<120]
plotting.plot([0.6*z for z in M],scale=max(r,c),dot_size=1) #会打开默认浏览器绘图
### 使用opencv
img = cv2.imread('img01.png',cv2.IMREAD_GRAYSCALE) #以灰度模式读入
# 不知道什么原因直接读取处理显示的图像同原来的不同,要旋转90度
img = cv2.rotate(img,cv2.ROTATE_90_CLOCKWISE)
size = img.shape
IMG = []
for i in range(size[0]):
for j in range(size[1]):
if img[i,j]<120: #灰度值小于120时
IMG.append((i+j*1j))
## 将复数列表转换出来,提取出实部和虚部
def cmplx2num(cmplx):
return np.array([[pt.real,pt.imag] for pt in cmplx])
## 绘制复平面下的图像
def cplot(L,c=(1,0,0)): # c是颜色参数
k = cmplx2num(L)
plt.scatter(k[:,0],k[:,1],c=c,s=0.5*np.ones(len(k[:,0])))
# plt.axis([-200,200,-200,200])
### 使用image的方法
# cplot([1j*1j*z for z in M])
# cplot(M,c=(0,0,1))
### 使用自己处理的方法
#又复数知识知乘上1j就逆时针旋转90度
cplot([1j*z for z in IMG],c=(0.4,0.1,0.3))
cplot([1j*1j*z for z in IMG])
cplot(IMG,c=(0,0,1))
plt.show()
代码最后那里可以乘以复数实现图像的变换。
下面是plotting.plot绘制的结果