您的位置:首页 > 运维架构

OpenCV之图像的生成、边界扩展、缩放变换、平移变换、仿射变换、透射变换——pthon实现

2018-12-29 22:04 831 查看

一、图像的生成———生成一个纯色图像

[code]import cv2
import numpy as np
img = np.ones((650,1000), dtype = np.uint8)
cv2.imshow('img',img)
cv2.waitKey(0)

图像矩阵各像素点的值均为0,即黑色图像。

 

 

二、扩展图像边缘

使用的函数:cv2.copyMakeBorder(src,top,bottom,left,right,borderType,value)

                       top、bottom、left、right为四个方向,上下左右,取值为拓展的像素值大小

                       src:要拓展的图像

                       borderType:边界的类型

                      value:仅仅是常亮时,边界才有意义

[code]#在图像边缘扩充图像
import cv2
import numpy as np
img = cv2.imread('Ghostblade.jpg')
#cv2.copyMakeBorder(src,top,bottom,left,right,borderType,value),四个方向,上下左右
img1 = cv2.copyMakeBorder(img,50,50,50,50,cv2.BORDER_CONSTANT,value=[0,0,0])
cv2.imshow('imag1',img1)
cv2.waitKey(0)
  • value = [0,0,0]也可以直接写成0

原图:



拓展图:

 

三、缩放变换

[code]#OpenCV提供了一个可以手动调节图片大小的函数,cv2.resize()
import cv2
import numpy as np
img = cv2.imread('Ghostblade.jpg')
#方法一:
# res = cv2.resize(img, None, fx = 0.5, fy = 0.5, interpolation= cv2.INTER_CUBIC)
#方法二:
height, width = img.shape[:2]
res = cv2.resize(img,(width//2, height//2), interpolation = cv2.INTER_AREA)
cv2.imshow('img',res)
cv2.waitKey(0)

尺寸变小,cv2.resize()函数中,图像的尺度信息不能是浮点数,必须是整数

  

 

四、平移变换

[code]import cv2
import numpy as np
img = cv2.imread('Ghostblade.jpg',0)   #读入时将图像转换为灰度图像
print(img.shape)  # 图像的大小为763*1600
rows, cols = img.shape        #因此img.shape只返回两个参数值
M = np.float32([[1,0,100], [0,1,50]])  #移动(100,50)
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.warpAffine()函数:进行仿射变换

 

五、仿射变换

[code]import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('Ghostblade.jpg')
rows, cols= img.shape[:2]
#取变换前后的三对对应点,求解仿射变换矩阵
pst1 = np.float32([[50,50],[200,50],[50,200]])
pst2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pst1, pst2)    #仿射变换的仿射矩阵
dst = cv2.warpAffine(img, M, (cols, rows))   #求解仿射变换后的图像

#对像素点进行像素值的更换
color = (0,0,255)
img[50,50] = color
img[200,50] = color
img[50,200] = color
dst[10,100] = color
dst[200,50] = color
dst[100,250] = color
cv2.imwrite('Input.jpg', img)   #保存改变像素点后的图像
cv2.imwrite('Output.jpg',dst)

#将图像由BGR空间改成RGB空间(OpenCV处理的是BGR空间,matplotlib处理的是RGB空间)
img = img[:,:,::-1]
dst = dst[:,:,::-1]
plt.figure()
plt.subplot(121), plt.imshow(img), plt.title('Input')
plt.subplot(122), plt.imshow(dst), plt.title('Output')
plt.show()

要使得仿射变换的图片完整显示,则可以先扩展图片,在进行仿射变换。

六、透射变换

[code]#透视变换,需要输入图像的四个点和输出图像上的对应点
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('Ghostblade.jpg')
#扩展图像,保证内容不超出可视范围
img = cv2.copyMakeBorder(img,200,200,200,200,cv2.BORDER_CONSTANT,0)
rows, cols = img.shape[:2]
pst1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pst2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv2.getPerspectiveTransform(pst1,pst2)
dst = cv2.warpPerspective(img,M,(cols,rows))
#BGR到RGB的转换
img = img[:,:,::-1]
dst = dst[:,:,::-1]
plt.subplot(121), plt.imshow(img), plt.title('Input')
plt.subplot(122), plt.imshow(dst),plt.title('Output')
plt.show()

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: