python实现的简单图像矩阵变换

37 篇文章 3 订阅

在学习《Coding the Matrix》的时候,了解到了矩阵变换在图像中的应用,先分享coursera的视频

链接:http://pan.baidu.com/s/1c23ZKzA 密码:yasi

该门课程的代码在下列网站提供:

Coding the Matrix Resources

因为刚学第一课,这里记录一下。关于矩阵变换网上有好多博文介绍,这里就只是通过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绘制的结果
这里写图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python可以使用OpenCV库来实现图像几何属性变换。主要包括以下几种变换: 1. 平移变换: 平移变换可以通过OpenCV库的cv2.warpAffine()函数实现。平移变换矩阵为: ``` M = [1, 0, tx] [0, 1, ty] ``` 其tx和ty分别表示x和y方向上的平移量。 示例代码: ```python import cv2 import numpy as np img = cv2.imread('input.jpg') rows, cols = img.shape[:2] # 平移变换矩阵 M = np.float32([[1, 0, 100], [0, 1, 50]]) # 执行平移变换 dst = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow('input', img) cv2.imshow('output', dst) cv2.waitKey(0) cv2.destroyAllWindows() ``` 2. 旋转变换: 旋转变换可以通过OpenCV库的cv2.getRotationMatrix2D()和cv2.warpAffine()函数实现。旋转变换矩阵为: ``` M = [cos(theta), -sin(theta), center_x * (1 - cos(theta)) + center_y * sin(theta)] [sin(theta), cos(theta), center_y * (1 - cos(theta)) - center_x * sin(theta)] ``` 其theta表示旋转角度,center_x和center_y表示旋转心的坐标。 示例代码: ```python import cv2 import numpy as np img = cv2.imread('input.jpg') rows, cols = img.shape[:2] # 旋转变换矩阵 M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 1) # 执行旋转变换 dst = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow('input', img) cv2.imshow('output', dst) cv2.waitKey(0) cv2.destroyAllWindows() ``` 3. 缩放变换: 缩放变换可以通过OpenCV库的cv2.resize()函数实现。缩放变换矩阵为: ``` M = [sx, 0, 0] [0, sy, 0] ``` 其sx和sy分别表示x和y方向上的缩放比例。 示例代码: ```python import cv2 import numpy as np img = cv2.imread('input.jpg') # 缩放变换矩阵 M = np.float32([[0.5, 0, 0], [0, 0.5, 0]]) # 执行缩放变换 dst = cv2.warpAffine(img, M, (0, 0), fx=2, fy=2) cv2.imshow('input', img) cv2.imshow('output', dst) cv2.waitKey(0) cv2.destroyAllWindows() ``` 4. 翻转变换: 翻转变换可以通过OpenCV库的cv2.flip()函数实现。翻转变换矩阵为: ``` M = [-1, 0, cols - 1] [0, 1, 0] ``` 其cols表示图像的宽度。 示例代码: ```python import cv2 import numpy as np img = cv2.imread('input.jpg') # 翻转变换矩阵 M = np.float32([[-1, 0, img.shape[1] - 1], [0, 1, 0]]) # 执行翻转变换 dst = cv2.warpAffine(img, M, (img.shape[1], img.shape[0])) cv2.imshow('input', img) cv2.imshow('output', dst) cv2.waitKey(0) cv2.destroyAllWindows() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值