Python图像水平方向错切变换数学原理及实现
一、引言
图像的几何变换在图像处理中被经常使用,其中图像错切变换也是常用的图像变换。图像错切错切变换包括水平方向错切变换和竖直方向错切变换,其数学原理很简单,就是简单的矩阵乘法。
本文给出了图像水平方向错切变换的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图像水平方向错切变换数学原理及实现相关推荐
- Matlab图像水平方向错切变换的数学原理及实现
一.引言 图像的几何变换在图像处理中被经常使用,其中图像错切变换也是常用的图像变换.图像错切错切变换包括水平方向错切变换和竖直方向错切变换,本文给出了灰度图像和彩色图像的水平方向错切变换的数学原理及m ...
- 1.4 Python图像的坐标变换-仿射变换
1.4 Python图像的坐标变换-仿射变换 文章目录 1.4 Python图像的坐标变换-仿射变换 1 算法原理 2 代码 3 效果 1 算法原理 图像的几何变换,也就是矩阵乘法. 通过仿射变换将图 ...
- python验证数学原理_一起学opencv-python九(性能的测量和优化与图像处理的数学原理)...
图像混合 其实用的就是cv2.addWeighted函数,前面也介绍过这个函数.不过首先得把图片的形状搞成一样的,这个画图可以做到. 接下来是一块比较重要的内容. 性能的测量和优化 参考 https: ...
- python 图像变化检测_Python OpenCV 霍夫(Hough Transform)直线变换检测原理,图像处理第 33 篇博客...
Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧.本篇博客是这个系列的第 33 篇. 基础知识铺垫 霍夫变换(Hough Transform)是图像处理领域中,从图像中识别几 ...
- 最小二乘法的数学原理推导及python代码
1. 什么是最小二乘法? 最小二乘法(Ordinary Least Squares)是一种常用的数据拟合方法,它通过最小误差的平方和来找到一组数据的最佳函数匹配. 很多软件中都包含最小二乘法功能的模块 ...
- 相关与卷积(数字信号处理)的数学原理及 Python 实现
数学原理 在数字信号处理中,相关(correlation)可以分为互相关(cross correlation)和自相关(auto-correlation). 互相关是两个数字序列之间的运算:自相关是单 ...
- 奇异值分解SVD数学原理及代码(Python)
奇异值分解SVD数学原理及代码(Python) 首先简单介绍一下什么是正交矩阵(酉矩阵) 如果 或 其中,E为单位矩阵,或,则n阶实矩阵A称为正交矩阵.正交矩阵是实数特殊化的酉矩阵,因此总是属于正规矩 ...
- [Python图像处理] 二十二.Python图像傅里叶变换原理及实现
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...
- 机器学习-隐马尔科夫python实现及数学原理讲解
文章目录 1. 隐马尔科夫 2. 直观分析 3. 数学原理 4. 实现 4.1 代码 1. 隐马尔科夫 隐马尔可夫模型(hidden Markov model,HMM)是关于时序的概率模型,描述由 ...
最新文章
- 今日头条员工感慨:30岁以上既可怜又可悲,宁愿选择23岁的,便宜、听话、好用!...
- 超图使用服务管理页面发布服务图解
- Visio与word搭配使用
- 删除苹果自带软件后果_删除 iPhone 自带的软件会有什么影响?
- adb shell input text 完美支持中文输入
- UNIX(多线程):27---多线程并发之原子操作与无锁编程
- Linux概要端口,LINUX中如何查看某个端口是否被占用(转发)
- Netty工作笔记0081---编解码器和处理器链梳理
- java zip ant 密码_java对 zip文件的压缩和解压(ant解决中文乱码)
- Python NetworkX – Python图形库
- springMVC工作过程
- “十四五”新一代信息技术产业发展
- 小技巧:DELL成就5620笔记本电脑网卡驱动
- python绘制人物关系图,Python来袭,教你用Neo4j构建“复联4”人物关系图谱!
- Highcharts - Bar Chart Column Chart
- 十亿级别的MySQL数据库表(InnoDB存储引擎),旧数据清理的蹩脚方案。
- 攀登数据基础设施高峰,这是一场勇敢者的游戏
- 北京,探索「宜居」的技术路径
- 射频(RF)基本理论:定义、特性、调制、扩频
- Quectel BC25 系列 尺寸紧凑、功耗超低 NB-IoT 无线通信模块[移远通信]
热门文章
- Java实现模拟电梯上下楼,初学者练手
- 飞书消息推送怎么换行?输入\n发送不成功怎么办?
- [转载]android 画虚线、实线,画圆角矩形,一半圆角
- 使用C#读取 NEF类型和JPG类型照片的拍摄时间
- python123程序设计题答案第三周_智慧职教2020Python程序设计(深圳信息职业技术学院)题目及答案...
- P5911 [POI2004]PRZ
- 【题解】2073: [POI2004]PRZ
- Lactoferrin-PEG-MTX/Paclitaxel 乳铁蛋白-聚乙二醇-甲氨蝶呤/紫杉醇
- Qt之线性回归之最小二乘法(使用QChart画线,伸手党福利)
- 火山视窗CEF浏览器实现简单的网页填表