本文章对应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
的类型相同。
这个函数有两个必须的参数
src
: 输入图片dsize
:输出图片的大小
经常使用的可选参数包括:fx
:水平的缩放倍数;当它是0的时候,他通过(double)dsize.width/src.cols
计算得来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大小相同的输出数组
这个函数有两个必选参数 :
src
:输入图像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