图像的放大和缩小
一、知识简介
在计算机图像处理和计算机图形学中,图像缩放(image scaling)是指对数字图像的大小进行调整的过程。图像缩放是一种非平凡的过程,需要在处理效率以及结果的平滑度(smoothness)和清晰度(sharpness)上做一个权衡。当一个图像的大小增加之后,组成图像的像素的可见度将会变得更高,从而使得图像表现得“软”。相反地,缩小一个图像将会增强它的平滑度和清晰度。
二、图像的放大和缩小的基本原理
图像的放大和缩小的基本原理就是一种映射,即缩小后或者放大后的图像像素位置向原图的一个映射。简单理解就是,将放大或者缩小后的图像将其的坐标(长宽)拉伸或者压缩到和原图一样大时,其像素坐标点对应在原图上的位置就是其映射位置
由上图可以看出,放大或者缩小后的图像的像素值取决于其映射到原图相应位置周围的元素
三、实现和放大图像的方法
1、等间隔采样法实现图像的放大和缩小
1、等间隔采样其实就是在原图中每间隔一定的距离取像素点放到输出图像上。
2、图像时等比例缩小,不等时是不等比例缩小,缩小图像的长和宽的比例会发生变化。
3、图像放大时是将原图像的像素直接对应搬移到放大后的图像画布上
四、python实现
算法的实现步骤:
(1)创建画布大小
设原图的大小为HW,将其放大(缩小)为(zoom_hH)(zoom_wW) = new_h, new_w :zoom_h为高缩放比例zoom_w为宽缩放比例 new_h, new_w缩放后的高和宽创建画布大小:new_h, new_w
(2)将原图向的像素映射到目标画布上
h = int(isampling_interval_h -0.5)
w = int(jsampling_interval_w -0.5)
h,w 是画布坐标 i,j是原图坐标 (3)当zoom_h==zoom_w时为等比例缩小;当zoom_h!=zoom_w时为不等比例放大(缩小);当zoom_h<1 &&
zoom_w<1时为图片缩小,zoom_h>1 && zoom_w>1时图片放大。
import numpy as np
def zoom_out_equal_interval(img, zoom_h, zoom_w):
'''
图像缩小—等间隔采样
:param img: 原图
:param zoom_h: 行缩放比例
:param zoom_w: 列缩放比例
:return:
'''
img_h, img_w ,channels = img.shape # 获取图像大小
new_h, new_w = int(img_h*zoom_h),int(img_w*zoom_w) # 缩放后的图片大小
print(new_h,new_w)
zoom_img = np.zeros((new_h,new_w,channels),dtype= np.uint8) # 创建缩放后的图片大小的矩阵
sampling_interval_h = zoom_h
sampling_interval_w = zoom_w
for i in range(img_h):
for j in range(img_w):
h = int(i*sampling_interval_h -0.5) # 按比例放大或者缩小
w = int(j*sampling_interval_w -0.5)
zoom_img[h][w] = img[i][j]
return zoom_img
import cv2
img = cv2.imread("lenna.png", 1)
zoom_h = 1.5
zoom_w = 1.5
zoom_img = zoom_out_equal_interval(img, zoom_h, zoom_w)
cv2.imshow("zoom_img", zoom_img)
cv2.waitKey(0)
五、结果
原图
行列个缩小0.5
zoom_h = 0.5
zoom_w = 0.5
行列各放大1.5倍
zoom_h = 1.5
zoom_w = 1.5
六、分析
放大的图像由于是原图像素直接搬移到放大后的画布上,导致放大后的画布上的一些像素位置没有值(值为0)。解决这个现象需要利用插值法对没有值的位置进行插值