目录

  • 一、平移
    • 1.调用函数(平移矩阵)
    • 2.像素操作(遍历赋值)
  • 二、旋转
    • 1.调用函数(旋转矩阵)
    • 2.像素操作(反向映射)
  • 三、镜像
    • 1.调用函数(镜像矩阵)
    • 2.像素操作(反向映射)
  • 四、缩放
    • 1.缩小(八邻域均值)
    • 2.放大(双线性插值)
  • 五、剪切
    • 索引切片

一、平移

1.调用函数(平移矩阵)

图像平移后的坐标:
[ x ′ y ′ 1 ] = [ 1 0 Δ x 0 1 Δ y 0 0 1 ] ⋅ [ x y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} =\begin{bmatrix} 1&0&\Delta x \\ 0&1&\Delta y \\ 0&0&1 \end{bmatrix} \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} ⎣ ⎡​x′y′1​⎦ ⎤​=⎣ ⎡​100​010​ΔxΔy1​⎦ ⎤​⋅⎣ ⎡​xy1​⎦ ⎤​
{ x ′ = x + Δ x y ′ = y + Δ y \begin{cases} x' =x + \Delta x \\ y' =y + \Delta y \end{cases} {x′=x+Δxy′=y+Δy​

warpAffine函数用法参考这里:warpAffine函数

程序实现及运行结果:

import cv2
import matplotlib.pyplot as plt
import numpy as np# 读取图像
img1 = cv2.imread("flower.jpeg")# 图像平移
h, w = img1.shape[:2]
M = np.float32([[1, 0, 100], [0, 1, 50]]) # 平移矩阵,y方向向下平移50,x方向向右平移100
dst = cv2.warpAffine(img1, M, (w, h))# 图像显示
fig, axes = plt.subplots(1, 2, figsize=(10, 8), dpi=100)
axes[0].imshow(img1[:, :, ::-1])
axes[0].set_title("original")
axes[1].imshow(dst[:, :, ::-1])
axes[1].set_title("after translation")plt.show()

2.像素操作(遍历赋值)

算法思想很简单,首先将所有像素点沿x方向向右平移100,一行一行的进行处理,将(0,100)处的彩色值赋值给(0,0)处,(0,101)处的彩色值赋值给(0,1)处,然后把第0行所有列(521列)处理完。之后再处理下一行。同理沿着y方向向下平移50也是差不多这个思想。
       至于这个从520到0也是有讲究的,因为我们为了避免移动过程发生覆盖而数据丢失,所以需要倒序处理。打个比方,第0行,假如我们从0列到520列,那么100列之后的值就会被覆盖,这样我们就不能正确将原来100列之后的初始值进行移动(赋值),而我们从第520列处理就可以完美的避免这个问题。

程序实现及运行结果:

import cv2
import matplotlib.pyplot as pltimg1 = cv2.imread('flower.jpeg')
img2 = img1.copy()# x方向向右平移100
for j in range(521):for i in range(520,-1,-1):if i<100:img2[j, i] = 0else:img2[j, i] = img2[j, i-100]# y方向向下平移50
for u in range(521):for v in range(520,-1,-1):if v<50:img2[v, u] = 0else:img2[v, u] = img2[v-50, u]# 图像显示
fig, axes = plt.subplots(1, 2, figsize=(10, 8), dpi=100)
axes[0].imshow(img1[:, :, ::-1])
axes[0].set_title("original")
axes[1].imshow(img2[:, :, ::-1])
axes[1].set_title("after translation")plt.show()

二、旋转

1.调用函数(旋转矩阵)


极坐标:
{ x = r ⋅ c o s α y = r ⋅ s i n α \begin{cases} x =r \cdot cos\alpha \\ y =r \cdot sin\alpha \end{cases} {x=r⋅cosαy=r⋅sinα​
{ x ′ = r ⋅ c o s ( α + θ ) = r ⋅ c o s α ⋅ c o s θ − r ⋅ s i n α ⋅ s i n θ = x ⋅ c o s θ − y ⋅ s i n θ y ′ = r ⋅ s i n ( α + θ ) = r ⋅ s i n α ⋅ c o s θ + r ⋅ c o s α ⋅ s i n θ = x ⋅ s i n θ + y ⋅ c o s θ \begin{cases} x' =r \cdot cos(\alpha+\theta)\\ \hspace{0.4cm} =r \cdot cos\alpha \cdot cos\theta - r \cdot sin\alpha \cdot sin\theta\\ \hspace{0.4cm} =x \cdot cos\theta - y \cdot sin\theta\\ \\ y' =r \cdot sin(\alpha+\theta)\\ \hspace{0.4cm} =r \cdot sin\alpha \cdot cos\theta + r \cdot cos\alpha \cdot sin\theta\\ \hspace{0.4cm} =x \cdot sin\theta + y \cdot cos\theta\\ \end{cases} ⎩ ⎨ ⎧​x′=r⋅cos(α+θ)=r⋅cosα⋅cosθ−r⋅sinα⋅sinθ=x⋅cosθ−y⋅sinθy′=r⋅sin(α+θ)=r⋅sinα⋅cosθ+r⋅cosα⋅sinθ=x⋅sinθ+y⋅cosθ​
直角坐标:
[ x ′ y ′ 1 ] = [ c o s θ − s i n θ 0 s i n θ c o s θ 0 0 0 1 ] ⋅ [ x y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} =\begin{bmatrix} cos\theta&-sin\theta&0 \\ sin\theta&cos\theta&0 \\ 0&0&1 \end{bmatrix} \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} ⎣ ⎡​x′y′1​⎦ ⎤​=⎣ ⎡​cosθsinθ0​−sinθcosθ0​001​⎦ ⎤​⋅⎣ ⎡​xy1​⎦ ⎤​
{ x ′ = x ⋅ c o s θ − y ⋅ s i n θ y ′ = x ⋅ s i n θ + y ⋅ c o s θ \begin{cases} x' =x \cdot cos\theta - y \cdot sin\theta\\ y' =x \cdot sin\theta + y \cdot cos\theta \end{cases} {x′=x⋅cosθ−y⋅sinθy′=x⋅sinθ+y⋅cosθ​

程序实现及运行结果:

import cv2
import matplotlib.pyplot as plt
import numpy as np
import math# 读取图像
img1 = cv2.imread("blossom.jpeg")# 图像旋转
h, w = img1.shape[:2]
M = np.float32([[math.cos(math.pi/4), -math.sin(math.pi/4), 0], [math.sin(math.pi/4), math.cos(math.pi/4), 0]]) # 顺时针旋转45°
dst = cv2.warpAffine(img1, M, (w, h))# 图像显示
fig, axes = plt.subplots(1, 2, figsize=(10, 8), dpi=100)
axes[0].imshow(img1[:, :, ::-1])
axes[0].set_title("original")
axes[1].imshow(dst[:, :, ::-1])
axes[1].set_title("after rotation")plt.show()

2.像素操作(反向映射)

此程序运用了一种反向映射的思想,这样可以确保旋转后的位置坐标都有彩色值,我们根据旋转矩阵的逆,可以找到旋转后的图像坐标所对应原图像的彩色值,从而对其进行赋值即可
       其中我们需要注意两个问题,一是我们旋转后的坐标位置所对应原图像的坐标可能是越界的(找不到坐标与其对应);二是我们求的坐标向量可能是负数,需要舍去。

程序实现及运行结果:

import cv2
import matplotlib.pyplot as plt
import numpy as np
import math# 读取图像
img1 = cv2.imread("blossom.jpeg")
img2 = img1.copy()# 图像旋转(反向映射)
RM1 = np.float32([[math.cos(math.pi/4), math.sin(math.pi/4), 0], [-math.sin(math.pi/4), math.cos(math.pi/4), 0], [0, 0, 1]]) # 计算出的旋转矩阵
RM2 = np.linalg.inv(RM1) # 求解旋转矩阵的逆for i in range(521):for j in range(521):D = np.dot(RM2, [[i], [j], [1]]) # 旋转后的图像坐标位置 相对应的 原图像坐标位置if int(D[0])>=521 or int(D[1])>=521: # 旋转后的图像坐标 相对应的 原图像坐标位置 越界img2[i, j] = 0elif int(D[0]) < 0 or int(D[1]) < 0: # 旋转后的图像坐标 相对应的 原图像坐标位置 负值img2[i, j] = 0else:img2[i, j] = img1[int(D[0]), int(D[1])]# 图像显示
fig, axes = plt.subplots(1, 2, figsize=(10, 8), dpi=100)
axes[0].imshow(img1[:, :, ::-1])
axes[0].set_title("original")
axes[1].imshow(img2[:, :, ::-1])
axes[1].set_title("after rotation")plt.show()

三、镜像

水平镜像:
{ x ′ = w i d t h − 1 − x y ′ = y \begin{cases} x' =width-1-x\\ y' =y \end{cases} {x′=width−1−xy′=y​
[ x ′ y ′ 1 ] = [ − 1 0 w i d t h − 1 0 1 0 0 0 1 ] ⋅ [ x y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} =\begin{bmatrix} -1&0&width-1 \\ 0&1&0 \\ 0&0&1 \end{bmatrix} \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} ⎣ ⎡​x′y′1​⎦ ⎤​=⎣ ⎡​−100​010​width−101​⎦ ⎤​⋅⎣ ⎡​xy1​⎦ ⎤​
垂直镜像:
{ x ′ = x y ′ = h e i g h t − 1 − y \begin{cases} x' =x\\ y' =height-1-y \end{cases} {x′=xy′=height−1−y​
[ x ′ y ′ 1 ] = [ 1 0 0 0 − 1 h e i g h t − 1 0 0 1 ] ⋅ [ x y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} =\begin{bmatrix} 1&0&0 \\ 0&-1&height-1 \\ 0&0&1 \end{bmatrix} \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} ⎣ ⎡​x′y′1​⎦ ⎤​=⎣ ⎡​100​0−10​0height−11​⎦ ⎤​⋅⎣ ⎡​xy1​⎦ ⎤​

1.调用函数(镜像矩阵)

import cv2
import matplotlib.pyplot as plt
import numpy as np# 读取图像
img1 = cv2.imread("technology building.jpeg")# 图像水平镜像
h, w = img1.shape[:2]
M = np.float32([[-1, 0, 520], [0, 1, 0]])
dst1 = cv2.warpAffine(img1, M, (w, h))# 图像垂直镜像
h, w = img1.shape[:2]
M = np.float32([[1, 0, 0], [0, -1, 520]])
dst2 = cv2.warpAffine(img1, M, (w, h))# 图像显示
fig, axes = plt.subplots(1, 3, figsize=(80, 10), dpi=100)
axes[0].imshow(img1[:, :, ::-1])
axes[0].set_title("original")
axes[1].imshow(dst1[:, :, ::-1])
axes[1].set_title("after horizontal-mirror")
axes[2].imshow(dst2[:, :, ::-1])
axes[2].set_title("after vertical-mirror")plt.show()

2.像素操作(反向映射)

import cv2
import matplotlib.pyplot as plt
import numpy as np# 读取图像
img1 = cv2.imread("technology building.jpeg")
img2 = img1.copy()
img3 = img1.copy()# 图像水平镜像
RM1 = np.float32([[1, 0, 0], [0, -1, 520], [0, 0, 1]]) # 计算出的旋转矩阵
RM2 = np.linalg.inv(RM1) # 求解旋转矩阵的逆
for i in range(521):for j in range(521):D = np.dot(RM2, [[i], [j], [1]]) # 旋转后的图像坐标位置 相对应的 原图像坐标位置if int(D[0])>=521 or int(D[1])>=521: # 旋转后的图像坐标 相对应的 原图像坐标位置 越界img2[i, j] = 0elif int(D[0]) < 0 or int(D[1]) < 0: # 旋转后的图像坐标 相对应的 原图像坐标位置 负值img2[i, j] = 0else:img2[i, j] = img1[int(D[0]), int(D[1])]# 图像垂直镜像
RM3 = np.float32([[-1, 0, 520], [0, 1, 0], [0, 0, 1]]) # 计算出的旋转矩阵
RM4 = np.linalg.inv(RM3) # 求解旋转矩阵的逆
for i in range(521):for j in range(521):D = np.dot(RM4, [[i], [j], [1]]) # 旋转后的图像坐标位置 相对应的 原图像坐标位置if int(D[0])>=521 or int(D[1])>=521: # 旋转后的图像坐标 相对应的 原图像坐标位置 越界img3[i, j] = 0elif int(D[0]) < 0 or int(D[1]) < 0: # 旋转后的图像坐标 相对应的 原图像坐标位置 负值img3[i, j] = 0else:img3[i, j] = img1[int(D[0]), int(D[1])]# 图像显示
fig, axes = plt.subplots(1, 3, figsize=(80, 10), dpi=100)
axes[0].imshow(img1[:, :, ::-1])
axes[0].set_title("original")
axes[1].imshow(img2[:, :, ::-1])
axes[1].set_title("after horizontal-mirror")
axes[2].imshow(img3[:, :, ::-1])
axes[2].set_title("after vertical-mirror")plt.show()

四、缩放

1.缩小(八邻域均值)

算法思想很简单,就是我们遍历原图像的每一个像素,原图像(1080×1437)的每一个像素与自己所在的八邻域(9个像素值)取平均值,然后将像素放进模板(360×479)中形成新的图像。相当于我们用一个3×3的卷积核对原图像进行卷积操作
       一共需要注意两个问题,一是我们先对边界元素扩充一行一列,这样原图像边界也可以很好的进行卷积操作而不越界;二是我们在进行求和会超出255而越界(每个通道像素值0-255,比如我们用230+230,不会得到460,而是会变成460-255-1=204),如果不处理,就会让我们的缩小图像变成黑色,所以我这里是先将所有值缩小10倍相加再放大10呗,当然你也可以选择使用其它方式。

程序实现及运行结果:

import cv2# 读取图像
img1 = cv2.imread("city.jpeg")
img3 = cv2.imread("img3.png") # 制作一个模板# 图像缩小
img2 = cv2.copyMakeBorder(img1, 1, 1, 1, 1, cv2.BORDER_REFLECT) # 上下左右各扩充1,复制最近像素# 索引列表(位置坐标)
list1 = list(range(1, 1080, 3))
list2 = list(range(360))
list3 = list(range(1, 1435, 3))
list4 = list(range(479))# 一个像素点自身与八邻域取均值
for i,u in zip(list1, list2):for j,v in zip(list3, list4):# 防止越界img3[u, v] = ((img2[i,j]/10 + img2[i-1,j-1]/10 + img2[i-1,j]/10 + img2[i,j+1]/10 + img2[i,j-1]/10 + img2[i,j+1]/10 + img2[i+1,j-1]/10 + img2[i+1,j]/10 + img2[i+1,j+1]/10) / 9)*10# 保存图像
cv2.imwrite('shrink.jpeg',img3)

original:

shrink:

2.放大(双线性插值)

单线性插值:

y − y 0 x − x 0 = y 1 − y 0 x 1 − x 0 \boxed {\frac {y-y_0} {x-x_0}=\frac {y_1-y_0} {x_1-x_0}} x−x0​y−y0​​=x1​−x0​y1​−y0​​​
y = x 1 − x x 1 − x 0 ⋅ y 0 + x − x 0 x 1 − x 0 ⋅ y 1 = d 1 d ⋅ y 0 + d 0 d ⋅ y 1 \boxed {y = \frac {x_1-x} {x_1-x_0} \cdot y_0+\frac {x-x_0} {x_1-x_0} \cdot y_1}={ \frac {d_1} {d} \cdot y_0+\frac {d_0} {d} \cdot y_1} y=x1​−x0​x1​−x​⋅y0​+x1​−x0​x−x0​​⋅y1​​=dd1​​⋅y0​+dd0​​⋅y1​
       这个公式表示的结果就是:x1和x0分别到x的距离作为权重,用于对y0和y1的加权。d0/d > d1/d,而y1到y < y0到y 说明y1比重更大,所以乘以d0/d。

双线性插值:

①x方向的单线性插值去分别计算R1、R2的像素值:
f ( x , y 1 ) = x 2 − x x 2 − x 1 ⋅ f ( Q 11 ) + x − x 0 x 1 − x 0 ⋅ f ( Q 21 ) \boxed {f(x,y_1) = \frac {x_2-x} {x_2-x_1} \cdot f(Q_{11})+\frac {x-x_0} {x_1-x_0} \cdot f(Q_{21})} f(x,y1​)=x2​−x1​x2​−x​⋅f(Q11​)+x1​−x0​x−x0​​⋅f(Q21​)​
f ( x , y 2 ) = x 2 − x x 2 − x 1 ⋅ f ( Q 12 ) + x − x 0 x 1 − x 0 ⋅ f ( Q 22 ) \boxed {f(x,y_2)= \frac {x_2-x} {x_2-x_1} \cdot f(Q_{12})+\frac {x-x_0} {x_1-x_0} \cdot f(Q_{22})} f(x,y2​)=x2​−x1​x2​−x​⋅f(Q12​)+x1​−x0​x−x0​​⋅f(Q22​)​

②y方向的单线性插值计算P点的像素值:
f ( x , y ) ≈ y 2 − y y 2 − y 1 ⋅ f ( x , y 1 ) + y − y 1 y 2 − y 1 ⋅ f ( x , y 2 ) \boxed {f(x,y) \approx \frac {y_2-y} {y_2-y_1} \cdot f(x,y_1)+\frac {y-y_1} {y_2-y_1} \cdot f(x,y_2)} f(x,y)≈y2​−y1​y2​−y​⋅f(x,y1​)+y2​−y1​y−y1​​⋅f(x,y2​)​

算法设计:

       假设我们取原图像的四个像素(如图所示15、16行,20、21列)(黑圈和红圈),像素值分别为P1、P2、P3、P4。
       以我们需要插值在(14.3,20.3)为例子,根据双线性插值原理计算:
       Q12 = 0.3×P2 + 0.7×P1
       Q34 = 0.3×P4 + 0.7×P3
       PQ = 0.3×Q34 + 0.7×Q12
       这样我们就可以得到绿色三角的像素值,根据每个插值的像素和原图像四个像素的距离得出它们各自的系数(权重),并能得到中间的(黄蓝紫黄)的像素值。
       最后,我们再把这四个像进行相应的外扩(如第三块图所示),就可以把原来2×2的图像放大成一幅4×4的图像。(继承了原图像的4个像素值,利用双线性插值得到了新的12个像素值)

程序实现及运行结果:

import cv2
import matplotlib.pyplot as plt# 定义一个类(双线性插值计算)
class bilinear_interpolation:P1 = P2 = P3 = P4 = 0# 计算图中绿色三角像素值def green(self):Q12_green = 0.3 * self.P2 + 0.7 * self.P1Q34_green = 0.3 * self.P4 + 0.7 * self.P3PQ_green = 0.3 * Q34_green + 0.7 * Q12_greenreturn PQ_green# 计算图中蓝色三角像素值def blue(self):Q12_blue = 0.6 * self.P2 + 0.4 * self.P1Q34_blue = 0.6 * self.P4 + 0.4 * self.P3PQ_blue = 0.3 * Q34_blue + 0.7 * Q12_bluereturn PQ_blue# 计算图中紫色三角像素值def purple(self):Q12_purple = 0.3 * self.P2 + 0.7 * self.P1Q34_purple = 0.3 * self.P4 + 0.7 * self.P3PQ_purple = 0.6 * Q34_purple + 0.4 * Q12_purplereturn PQ_purple# 计算图中黄色三角像素值def yellow(self):Q12_yellow = 0.6 * self.P2 + 0.4 * self.P1Q34_yellow = 0.6 * self.P4 + 0.4 * self.P3PQ_yellow= 0.6 * Q34_yellow + 0.4 * Q12_yellowreturn PQ_yellowBI = bilinear_interpolation()# 读取图像
img1 = cv2.imread("sunset.jpg")
img2 = cv2.imread("img4.png") # 制作一个模板# 索引列表(位置坐标)
list1 = list(range(0, 322, 2))
list2 = list(range(0, 644, 4))
list3 = list(range(0, 500, 2))
list4 = list(range(0, 1000, 4))# 放大图像(双线性插值)
for i,u in zip(list1, list2):for j,v in zip(list3, list4):img2[u, v], img2[u, v+3], img2[u+3, v], img2[u+3, v+3] = img1[i, j], img1[i, j+1], img1[i+1, j], img1[i+1, j+1] # 原图像未更改像素值BI.P1 = img1[i, j]; BI.P2 = img1[i, j + 1]; BI.P3 = img1[i + 1, j]; BI.P4 = img1[i + 1, j + 1]img2[u, v+1] = img2[u+1, v] = img2[u+1, v+1] =BI.green()img2[u, v+2] = img2[u+1, v+3] = img2[u+1, v+2] =BI.blue()img2[u+2, v] = img2[u+3, v+1] = img2[u+2, v+1] =BI.purple()img2[u+3, v+2] = img2[u+2, v+3] = img2[u+2, v+2] =BI.yellow()# 保存图像
cv2.imwrite('enlarged.jpeg',img2)

original:

enlarged:

五、剪切

索引切片

程序实现及运行结果:

import cv2
import matplotlib.pyplot as plt# 读取图像
img1 = cv2.imread("podoid.jpeg")
print(img1.shape) # (1290, 1080, 3)
# 图像剪切
img2 = img1[420:800, 300:800]
print(img2.shape) # (380, 500, 3)# 图像显示
fig, axes = plt.subplots(1, 2, figsize=(10, 8), dpi=100)
axes[0].imshow(img1[:, :, ::-1])
axes[0].set_title("original")
axes[1].imshow(img2[:, :, ::-1])
axes[1].set_title("shear")plt.show()

本文代码已开源,欢迎大家进行二次开发:https://gitee.com/xiaolong_ROS/Graphics-Processing-and-Machine-Vision

如有错误或者不足之处,欢迎大家留言指正!

图像的几何变换—平移、旋转、镜像、缩放、剪切(原理+调用函数+像素操作)相关推荐

  1. 三维空间中的几何变换-平移旋转缩放

    前言 前段时间由于项目需要,深入学习了下图形几何变换,主要是绕任意轴旋转部分(其他的已有一定基础),现记录学习笔记. 文章内容部分引用并参考了下面的博客: http://netclass.csu.ed ...

  2. 基于OpenCV做图像数据增强(平移、镜像、缩放、旋转、仿射)

    前言: 基于OpenCV的基本使用,对图像的数据量进行数据增强,使得框架对神经网络进行训练,提高模型的鲁棒性以及准确性. 原图: 1.平移 平移通过自定义平移矩阵以及函数warpAffine实现: 代 ...

  3. 图像几何变换:旋转,缩放,斜切

    几何变换 几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动. 几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定 ...

  4. 【OpenCV】图像几何变换:旋转,缩放,斜切

    2019独角兽企业重金招聘Python工程师标准>>> 几何变换 几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动. 几何运算需要空间变换和灰度级差值两个步骤的算 ...

  5. OpenCV-图像几何变换:旋转,缩放,斜切 .

    几何变换 几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动. 几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定 ...

  6. Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊)

    Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊) 目录 Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊) 前言 简单的平移.旋转和放缩 其他元素的一些基本使用 qm ...

  7. 图像算法二:【图像几何变换】平移、镜像、转置、缩放、旋转、插值

    作为一个强大的科学计算软件,MATLAB广泛运用于较多领域,以其简单的编程风格著称.这篇文章便通过matlab语言来讲述如何进行图像的各种几何变换. 图像几何变换又称为图像空间变换,它是将一幅图像中的 ...

  8. 图像几何变换C++实现--镜像,平移,旋转,错切,缩放

    一.图像几何变换介绍 图像的几何空间变换是图像处理中的最基础的算法,是指对原始图像按需要改变其大小.形状和位置的变化,原始图像与目标函数之间的坐标变换函数为线性函数.二维图像的基本几何变换主要包括镜像 ...

  9. MFC空间几何变换之图像平移、镜像、旋转、缩放

    本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行讲解,主要通过MFC单文档视图实现显示BMP图片空间几何变换,包括图像平移.图形 ...

最新文章

  1. Mysql练习_mysql练习题
  2. 005-SDK框架之LYWSDKCallBackListener.h
  3. jane street information session on pythonandocaml
  4. adams2016安装教程
  5. 给自己一个微笑,让生命带给我们更多的幸福。
  6. Long Beautiful Integer CodeForces - 1268A(贪心构造)
  7. HTML5 之 简单汇总
  8. 小马源码_Java互联网架构-重新认识Java8-HashMap-不一样的源码解读
  9. System.Runtime.InteropServices浅见
  10. CV Code | 计算机视觉开源周报 20190604期
  11. Java实现正整数数组的最小拼接数
  12. java关于贪吃蛇的源代码_完整的贪吃蛇(蛇吃蛋)Java源代码
  13. 2020级C语言大作业 - 火柴人打羽毛球
  14. DB2 开发系列 从入门开始--概述
  15. Windows Sever 2012 R2 组策略将everyone权限应用于匿名用户
  16. 数字图像处理王慧琴课后答案_清华大学出版社-图书详情-《数字图像处理(第3版)》...
  17. 主流各云平台主机性能对比
  18. Unlawfully wed 小小新娘 | 经济学人中英双语对照精读笔记
  19. R语言条件逻辑回归-因变量是配对资料
  20. 运营好公众号需要具备的能力/技能

热门文章

  1. 济南申报高新技术企业不符合的条件
  2. 亚马逊云科技的区域和可用区概念解释
  3. [附源码]java毕业设计创意众筹网站
  4. 云闪付华为P9指纹_截胡小米支付妥妥的!华为支付正式上线,支持25家银行
  5. 为什么人生病了就要静养呢?
  6. LQ0142 技能升级【二分】
  7. 混合波束成形|基础:深入浅出5G,毫米波,大规模MIMO与波束赋形
  8. 小马智行与速腾聚创展开全面战略合作
  9. Flask全套知识点从入门到精通,学完可直接做项目
  10. 弗洛伊德 震惊二十世纪的一种分析