一、引言

图像的几何变换在图像处理中被经常使用,其中图像错切变换也是常用的图像变换。图像错切错切变换包括水平方向错切变换和竖直方向错切变换,其数学原理很简单,就是简单的矩阵乘法。
本文给出了图像水平方向错切变换的Python详细实现过程(纯手工)。

二、数学原理

假设变换之前的坐标为(x,y),变换之后的坐标为(x*, y*),则沿水平方向错切变换变换公式的矩阵形式为:

其中系数b是错切比例。
展开之后就是:

由此可以看出水平方向的错切变换就是针对列坐标x进行变换,而行坐标y不变。

三、Python手工实现图像水平方向错切变换

1.单通道图像水平方向变换

#im为单通道图像像素矩阵
#delta为错切比例,delta>0表示向右错切,否则向左侧错切
#返回错切变换结果图像
def SingleChannelShearX( im, delta ):[m, n] = np.shape( im )w = int( n + abs( delta * m ) )imRT = np.zeros( [ m, w ] )for i in range( m ):for j in range( n ):if delta > 0:imRT[m-i-1][j + int( delta*i )] = im[m-i-1][j]else:imRT[i][j + int( -delta*i )] = im[i][j]imRT = imRT.clip( 0, 255 )#限制灰度值在0~255之间imRT = np.rint(imRT).astype('uint8')#设置像素的数据类型 return imRT

2.灰度图像或彩色图像水平方向错切变换
灰度图像直接调用前面的单通道图像变换函数即可。
彩色图像针对R、G、B分量分别调用单通道图变换函数即可。

def ImageShearTransform( im, delta ):dims = np.shape( im )#获取图像维数lens = len( dims )   #lens值为2则是灰度图像,为3则是彩色图像if lens == 2:#单通道图像imRT = SingleChannelShearX( im, delta )if lens == 3:#三通道图像imr = im[ :, :, 0 ]img = im[ :, :, 1 ]imb = im[ :, :, 2 ]imrRT = SingleChannelShearX( imr, delta )imgRT = SingleChannelShearX( img, delta )imbRT = SingleChannelShearX( imb, delta )imRT = np.stack( ( imrRT, imgRT, imbRT ), 2  )return imRT

3.完整的图像沿水平方向错切变换代码

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
#单通道图像的水平方向错切变换
#im为单通道图像像素矩阵
#delta为错切比例,delta>0表示向右错切,否则向左侧错切
#返回错切变换结果图像
def SingleChannelShearX( im, delta ):[m, n] = np.shape( im )w = int( n + abs( delta * m ) )imRT = np.zeros( [ m, w ] )for i in range( m ):for j in range( n ):if delta > 0:imRT[m-i-1][j + int( delta*i )] = im[m-i-1][j]else:imRT[i][j + int( -delta*i )] = im[i][j]imRT = imRT.clip( 0, 255 )#限制灰度值在0~255之间imRT = np.rint(imRT).astype('uint8')#设置像素的数据类型 return imRT
#图像水平方向错切变换,可以是灰度图像,也可以是彩色图像
def ImageShearTransform( im, delta ):dims = np.shape( im )#获取图像维数lens = len( dims )   #lens值为2则是灰度图像,为3则是彩色图像if lens == 2:#单通道图像imRT = SingleChannelShearX( im, delta )if lens == 3:#三通道图像imr = im[ :, :, 0 ]img = im[ :, :, 1 ]imb = im[ :, :, 2 ]imrRT = SingleChannelShearX( imr, delta )imgRT = SingleChannelShearX( img, delta )imbRT = SingleChannelShearX( imb, delta )imRT = np.stack( ( imrRT, imgRT, imbRT ), 2  )return imRTdef main():im = np.array( Image.open('dog.jpg', 'r') )#im = np.array( Image.open('lena.bmp', 'r') )#print( 'size:',im.shape )plt.figure()plt.imshow( im, cmap = 'gray' )plt.axis( 'off' )delta = -0.5#向左侧错切imRT = ImageShearTransform( im, delta )plt.figure()plt.imshow( imRT, cmap = 'gray' )plt.axis( 'off' )delta = 0.5#向右侧错切imRT = ImageShearTransform( im, delta )plt.figure()plt.imshow( imRT, cmap = 'gray' )plt.axis( 'off' )if __name__ == '__main__':
main()

运行结果:


Python图像水平方向错切变换数学原理及实现相关推荐

  1. Matlab图像水平方向错切变换的数学原理及实现

    一.引言 图像的几何变换在图像处理中被经常使用,其中图像错切变换也是常用的图像变换.图像错切错切变换包括水平方向错切变换和竖直方向错切变换,本文给出了灰度图像和彩色图像的水平方向错切变换的数学原理及m ...

  2. 1.4 Python图像的坐标变换-仿射变换

    1.4 Python图像的坐标变换-仿射变换 文章目录 1.4 Python图像的坐标变换-仿射变换 1 算法原理 2 代码 3 效果 1 算法原理 图像的几何变换,也就是矩阵乘法. 通过仿射变换将图 ...

  3. python验证数学原理_一起学opencv-python九(性能的测量和优化与图像处理的数学原理)...

    图像混合 其实用的就是cv2.addWeighted函数,前面也介绍过这个函数.不过首先得把图片的形状搞成一样的,这个画图可以做到. 接下来是一块比较重要的内容. 性能的测量和优化 参考 https: ...

  4. python 图像变化检测_Python OpenCV 霍夫(Hough Transform)直线变换检测原理,图像处理第 33 篇博客...

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧.本篇博客是这个系列的第 33 篇. 基础知识铺垫 霍夫变换(Hough Transform)是图像处理领域中,从图像中识别几 ...

  5. 最小二乘法的数学原理推导及python代码

    1. 什么是最小二乘法? 最小二乘法(Ordinary Least Squares)是一种常用的数据拟合方法,它通过最小误差的平方和来找到一组数据的最佳函数匹配. 很多软件中都包含最小二乘法功能的模块 ...

  6. 相关与卷积(数字信号处理)的数学原理及 Python 实现

    数学原理 在数字信号处理中,相关(correlation)可以分为互相关(cross correlation)和自相关(auto-correlation). 互相关是两个数字序列之间的运算:自相关是单 ...

  7. 奇异值分解SVD数学原理及代码(Python)

    奇异值分解SVD数学原理及代码(Python) 首先简单介绍一下什么是正交矩阵(酉矩阵) 如果 或 其中,E为单位矩阵,或,则n阶实矩阵A称为正交矩阵.正交矩阵是实数特殊化的酉矩阵,因此总是属于正规矩 ...

  8. [Python图像处理] 二十二.Python图像傅里叶变换原理及实现

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  9. 机器学习-隐马尔科夫python实现及数学原理讲解

    文章目录 1. 隐马尔科夫 2. 直观分析 3. 数学原理 4. 实现 4.1 代码 1. 隐马尔科夫   隐马尔可夫模型(hidden Markov model,HMM)是关于时序的概率模型,描述由 ...

最新文章

  1. 今日头条员工感慨:30岁以上既可怜又可悲,宁愿选择23岁的,便宜、听话、好用!...
  2. 超图使用服务管理页面发布服务图解
  3. Visio与word搭配使用
  4. 删除苹果自带软件后果_删除 iPhone 自带的软件会有什么影响?
  5. adb shell input text 完美支持中文输入
  6. UNIX(多线程):27---多线程并发之原子操作与无锁编程
  7. Linux概要端口,LINUX中如何查看某个端口是否被占用(转发)
  8. Netty工作笔记0081---编解码器和处理器链梳理
  9. java zip ant 密码_java对 zip文件的压缩和解压(ant解决中文乱码)
  10. Python NetworkX – Python图形库
  11. springMVC工作过程
  12. “十四五”新一代信息技术产业发展
  13. 小技巧:DELL成就5620笔记本电脑网卡驱动
  14. python绘制人物关系图,Python来袭,教你用Neo4j构建“复联4”人物关系图谱!
  15. Highcharts - Bar Chart Column Chart
  16. 十亿级别的MySQL数据库表(InnoDB存储引擎),旧数据清理的蹩脚方案。
  17. 攀登数据基础设施高峰,这是一场勇敢者的游戏
  18. 北京,探索「宜居」的技术路径
  19. 射频(RF)基本理论:定义、特性、调制、扩频
  20. Quectel BC25 系列 尺寸紧凑、功耗超低 NB-IoT 无线通信模块[移远通信]

热门文章

  1. Java实现模拟电梯上下楼,初学者练手
  2. 飞书消息推送怎么换行?输入\n发送不成功怎么办?
  3. [转载]android 画虚线、实线,画圆角矩形,一半圆角
  4. 使用C#读取 NEF类型和JPG类型照片的拍摄时间
  5. python123程序设计题答案第三周_智慧职教2020Python程序设计(深圳信息职业技术学院)题目及答案...
  6. P5911 [POI2004]PRZ
  7. 【题解】2073: [POI2004]PRZ
  8. Lactoferrin-PEG-MTX/Paclitaxel 乳铁蛋白-聚乙二醇-甲氨蝶呤/紫杉醇
  9. Qt之线性回归之最小二乘法(使用QChart画线,伸手党福利)
  10. 火山视窗CEF浏览器实现简单的网页填表