美文网首页Python专辑机器学习与计算机视觉图像处理
Python和OpenCV中的基本图像操作:缩放、旋转和剪裁

Python和OpenCV中的基本图像操作:缩放、旋转和剪裁

作者: luohuayong | 来源:发表于2017-06-12 11:23 被阅读3365次

    在开始代码前需要先安装Python2.7和Opencv2/Opencv3。具体安装方式可以看OpenCV官网,或者百度。这里不做详细介绍。

    我们使用侏罗纪公园视频的一张截图为例子:

    图1 侏罗纪公园截图

    首先我们加载图像并将其显示在屏幕上:

    # 导入需要的包
    import cv2
    
    # 载入图像并显示
    image = cv2.imread("jurassic-park-tour-jeep.jpg")
    cv2.imshow("win", image)
    cv2.waitKey(0)
    

    执行这段代码,我们可以看到这样的结果:

    图2 载入并显示图片

    分析下上面的代码:

    • 第2行:告诉Python解释器导入Opencv包
    • 第5行:从磁盘加载图像。imread函数将返回一个Numpy数组,表示图像本身
    • 第6行和第7行:imshow函数在屏幕显示图像。第一个参数是一个字符串,是显示图像窗口的名称。第二个参数是图像的引用。最后,调用waitKey函数暂停脚本执行,直到我们按下键盘上的一个键。参数“0”表示无限期等待,也可以给一个其他的值,表示以毫秒为单位的等待时长,比如“5000”,那代码将等待5秒后继续执行。
    # 输出图像尺寸
    print image.shape
    

    执行该代码,我们看到(388,647,3)输出到控制台。这表示这个图像有388行,647列以及3个颜色通道(RGB)。

    提示:当我们获取图像尺寸时,获取的是(行,列,颜色通道)这样的值。但是我们在指定图像尺寸时,我们应该给出(列,行)这样的值,顺序是有差别的。这可能会造成一些混乱,我们自己要记清楚。

    现在我们知道图像的宽度是647像素,我们将宽度调整为100像素:

    # 保持图片的宽高等比例缩放,以保证图片显示不变形
    # 计算新图片相对于旧图片的比例
    r = 100.0/image.shape[1]
    dim = (100, int(image.shape[0]*r))
    
    # 执行图片缩放,并显示
    resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
    cv2.imshow("resized", resized)
    cv2.waitKey(0)
    

    执行代码,我们看到新的图像只有100像素宽:

    图3 将图像调整为100像素宽

    分析下代码:

    • 第3行和第4行:为了防止变形,我们必须保持图像的长宽比。为了让图像调整为100像素宽,我们计算出新宽度与旧宽度的比值r,然后,我们用比值r乘以旧高度,得到新高度。
    • 第7行:实际调整图像尺寸是在这行,第一个参数是原始图像,第二个参数是目标图像的尺寸(宽,高),第三个参数是调整图像尺寸时,使用的算法函数,现在我们不用关心具体实现细节。

    接下来,我们旋转图片:

    # 获取图片尺寸并计算图片中心点
    (h, w) = image.shape[:2]
    center = (w/2, h/2)
    
    # 将图像旋转180度
    M = cv2.getRotationMatrix2D(center, 180, 1.0)
    rotated = cv2.warpAffine(image, M, (w, h))
    cv2.imshow("rotated", rotated)
    cv2.waitKey(0)
    

    运行结果:

    图4 图片被翻转180度

    我们看下代码:

    • 第2行:为了方便使用,我们获取图像的宽度和高度,并保存到相应变量中
    • 第3行:计算图像的中心点,这里我们简单的将宽度和高度各除以2
    • 第6行:计算用于旋转图像的矩阵。第一个参数是旋转的中心点,这里我们让它绕图片中心点进行旋转,当然也可以围绕其它点旋转。第二个参数是旋转的角度,以度为单位。第三个参数是缩放比例,这是是1.0,就是保持图像尺寸不变。如果我们希望旋转后的图像减半,我们使用0.5。
    • 第7行:通过提供图像、旋转矩阵和输出尺寸执行实际的旋转。
    • 第8行和第9行:显示旋转后的图像。

    我们再来做一个图像的部分截图:

    # 使用numpy数组切片对图像进行剪裁
    cropped = image[70:170, 440:540]
    cv2.imshow("cropped", cropped)
    cv2.waitKey(0)
    

    执行后的效果:


    图5 对图像进行剪裁

    在OpenCV中进行图像剪裁非常简单,我们所作的就是切片数组。在Y轴上给出startY和endY,在X轴上给出startX和endX,然后切面。
    最后一个例子,我们将剪裁的图像保存到磁盘,并保存为PNG格式(原图是JPG格式):

    # 将剪切后的图片以PNG格式保存至磁盘
    cv2.imwrite("thumbnail.png", cropped)
    

    这里,我们提供的第一个参数是文件的路径,第二个参数是要保存的图像。OpenCV会根据我们给出的文件后缀名,自动生成保存的文件格式。

    相关文章

      网友评论

      • 56322fe44873:问下有没裁剪掉多余空白的算法和裁剪后图片与原图算出那个之前裁剪图的xy坐标?
      • Latlng:我想请教个问题,odoo 中 |= 是什么意思
        luohuayong:| 是按位"或" 运算,|= 运算符类似于 +=
        a |= b 等价于 a = a | b

      本文标题:Python和OpenCV中的基本图像操作:缩放、旋转和剪裁

      本文链接:https://www.haomeiwen.com/subject/dykfqxtx.html