第三节 基础图像变换

本文章对应OpenCV免费公开课第三节 Basic Image Manipulation。课程链节OpenCV官网 配合官网视频教程效果更好。
记得关注专栏啊!最近跟新会很频繁的!

在本节课中会涉及以下概念。

  • 访问并修改图片像素
  • 图片大小修改
  • 剪切
  • 翻转

准备

下载素材

通过一下命令 理论上可以下载到所需的所有素材。

def download_and_unzip(url, save_path):  
    print(f"Downloading and extracting assests....", end="")  
  
    # Downloading zip file using urllib package.  
    urlretrieve(url, save_path)  
  
    try:  
        # Extracting zip file using the zipfile package.  
        with ZipFile(save_path) as z:  
            # Extract ZIP file contents in the same directory.  
            z.extractall(os.path.split(save_path)[0])  
  
        print("Done")  
  
    except Exception as e:  
        print("\nInvalid file.", e)

URL = r"https://www.dropbox.com/s/rys6f1vprily2bg/opencv_bootcamp_assets_NB2.zip?dl=1"  
  
asset_zip_path = os.path.join(os.getcwd(), "opencv_bootcamp_assets_NB2.zip")  
  
# Download if assest ZIP does not exists.  
if not os.path.exists(asset_zip_path):  
    download_and_unzip(URL, asset_zip_path)

下载不了的这里有百度网盘链接:
https://pan.baidu.com/s/1s3yGt01bBz-EFOL0bH7UNA?pwd=feyq 提取码: feyq

导入库

import os  
import cv2  
import numpy as np  
import matplotlib.pyplot as plt  
  
from zipfile import ZipFile  
from urllib.request import urlretrieve  
  
from IPython.display import Image  //让图像可以直接在jupyter中显示
  
%matplotlib inline //让图像可以直接在jupyter中显示

原始棋盘图像

cb_img = cv2.imread("checkerboard_18x18.png", 0)  
  
# 将色彩空间设置为灰度 以便正确显示图像
plt.imshow(cb_img, cmap="gray")  
print(cb_img)

访问一个单独的像素

让我们看看如何访问图片中单个像素的值、
为了访问任何在numpy数组中任何一个像素的值,你需要使用矩阵符号例如 matrix[r,c],此处r是行数 c是列数。另外提醒 此处行列起始位均为0.
例如,如果你想要访问第一个相许,你需要使用指令 matrix[0,0]。让我们配合例子食用。我们将打印左上角的一个黑色像素和中上方的一个白色像素的值。

# 打印第一个黑色方块的第一个黑色像素  
print(cb_img[0, 0])  
# 打印第一个黑色方块周围的紧邻的白色像素  
print(cb_img[0, 6])

打印结果为

0
255

修改图片像素

我们可以通过与上方方式相同的方法修改像素的强度。

cb_img_copy = cb_img.copy()  
cb_img_copy[2, 2] = 200  
cb_img_copy[2, 3] = 200  
cb_img_copy[3, 2] = 200  
cb_img_copy[3, 3] = 200  
  
# 以下指令和上方相同指令作用相同
# cb_img_copy[2:3,2:3] = 200  
  
plt.imshow(cb_img_copy, cmap="gray")  
print(cb_img_copy)

裁减图像

裁减图像仅仅是通过选择图片中的特定区域来实现的。

img_NZ_bgr = cv2.imread("New_Zealand_Boat.jpg", cv2.IMREAD_COLOR)  
img_NZ_rgb = img_NZ_bgr[:, :, ::-1]  
  
plt.imshow(img_NZ_rgb)

裁剪出图片的中心区域

cropped_region = img_NZ_rgb[200:400, 300:600]  
plt.imshow(cropped_region)

修改图片大小

resize函数可以将图片src扩大或缩小到特定大小。大小和方式通过src,dsize,fx,和fy来指定.

函数参数

dst = resize( src, dsize[, dst[, fx[, fy[, interpolation]]]] )

dst:输出图像;他的大小为dsize(当dsize不为0的时候) 或通过src.size(),fx 和 fy 计算后的大小。dst的类型和src的类型相同。

这个函数有两个必须的参数

  1. src: 输入图片
  2. dsize:输出图片的大小
    经常使用的可选参数包括:
  3. fx:水平的缩放倍数;当它是0的时候,他通过(double)dsize.width/src.cols计算得来
  4. fy:竖直的缩放倍数;当它是0的时候,他通过(double)dsize.height/src.rows计算得来
    当dsize不为0的时候,输出图片大小的为dsize,其他时候通过以上规则通过fx与fy计算得来。dst和src的图片类型相同。

OpenCV Documentation

resize(): Documentation link

方法一: 通过fx与fy设定缩放倍率

resized_cropped_region_2x = cv2.resize(cropped_region, None, fx=2, fy=2)  
plt.imshow(resized_cropped_region_2x)

此处将 上一步 裁减后的图片放大到原来的两倍

方法二:设定准确的输出图像大小

desired_width = 100  
desired_height = 200  
dim = (desired_width, desired_height)  
  
# Resize background image to sae size as logo image  
resized_cropped_region = cv2.resize(cropped_region, dsize=dim, interpolation=cv2.INTER_AREA)  
plt.imshow(resized_cropped_region)

将图片大小设置为 100*200

此处interpolation表示使用的差值算法

在不改变长款比例的情况下缩放

# 方法二: 使用 'dsize'
desired_width = 100  
aspect_ratio = desired_width / cropped_region.shape[1]  
desired_height = int(cropped_region.shape[0] * aspect_ratio)  
dim = (desired_width, desired_height)  
  
# 重新调整大小  
resized_cropped_region = cv2.resize(cropped_region, dsize=dim, interpolation=cv2.INTER_AREA)  
plt.imshow(resized_cropped_region)

让我们真正的展示出修改后的图片

# 转换图片图层格式
resized_cropped_region_2x = resized_cropped_region_2x[:, :, ::-1]  
  
# 将图片保存到硬盘
cv2.imwrite("resized_cropped_region_2x.png", resized_cropped_region_2x)  
  
# 展示裁减并缩放后的图片
Image(filename="resized_cropped_region_2x.png")
# 转换图片图层格式 
cropped_region = cropped_region[:, :, ::-1]  
  
# 保存剪切后的范围 
cv2.imwrite("cropped_region.png", cropped_region)  
  
# 展示裁减并缩放后的图片
Image(filename="cropped_region.png")

旋转图像

flip可以将数组以三种方式之一翻转。

函数参数

dst = cv.flip( src, flipCode )

dst:和src大小相同的输出数组

这个函数有两个必选参数

  1. src:输入图像
  2. flipCode:一个规定如何翻转的函数;0表示岩x轴翻转,一个正数(如1)表示延y轴方向翻转。负数(如-1)表示同时延两个方向翻转。

OpenCV Documentation

flip: Documentation link

img_NZ_rgb_flipped_horz = cv2.flip(img_NZ_rgb, 1)  
img_NZ_rgb_flipped_vert = cv2.flip(img_NZ_rgb, 0)  
img_NZ_rgb_flipped_both = cv2.flip(img_NZ_rgb, -1)  
  
# 展示图片
plt.figure(figsize=(18, 5))  
plt.subplot(141);plt.imshow(img_NZ_rgb_flipped_horz);plt.title("Horizontal Flip");  
plt.subplot(142);plt.imshow(img_NZ_rgb_flipped_vert);plt.title("Vertical Flip");  
plt.subplot(143);plt.imshow(img_NZ_rgb_flipped_both);plt.title("Both Flipped");  
plt.subplot(144);plt.imshow(img_NZ_rgb);plt.title("Original");

课后习题

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

谢谢~

原文为OpenCV免费公开课Free OpenCV Course - Official Certification by OpenCV
翻译 TallentJoe
未经允许,禁止转载


答案: BCACC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值