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

在开始代码前需要先安装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会根据我们给出的文件后缀名,自动生成保存的文件格式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容