OpenCV图像处理技术之色彩空间与几何变换

© Fu Xianjun. All Rights Reserved.所有素材来自于小傅老师。

哈哈哈,我来了!记得上一期留的任务嘛?

OpenCV图像处理技术之色彩空间与几何变换_第1张图片

我来公布答案了噢!OpenCV图像处理技术之色彩空间与几何变换_第2张图片

开始今天的Open CV的学习吧,今天我们要学习的是色彩空间与几何变换

重点:色彩空间的相互转换,几何变换的应用。

难点:提取特定颜色的物体,实现图像的几何矫正。

任务一:图像类型转换

先来巩固一下知识

  RGB颜色空间以R(Red:红)、G(Green:绿)、B(Blue:蓝)三种基本色为基础,进行不同程度的叠加,产生丰富而广泛的颜色,所以俗称三基色模式。通常的用(0,0,0)~(255,255,255)表示。

  GRAY颜色空间(灰度图像)通常指8位灰度图,具有256个灰度级,像素值的范围为[0,255]。所谓灰度色,就是指纯白、纯黑以及两者中的一系列从黑到白的过渡色。

  HSV(Hue, Saturation, Value)是根据颜色的直观特性创建的一种颜色空间, 也称六角锥体模型。这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。

案例一 将图像在BGR模式与RGB模式之间转换

import cv2
import numpy as np

img1=cv2.imread("pig.jpg")
rgb = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)#图像类型转换函数
cv2.imshow("BGR",img1)
cv2.imshow("RGB",rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()

案例二 将图像在BGR模式与GRAY模式之间转换

gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
cv2.imshow("GRAY",gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

重点:颜色通道分离

def Colorsplit(img):
    (B,G,R) = cv2.split(img)#将BGR图像的颜色通道分离
    cv2.imshow("blue",B)
    cv2.imshow("green",G)
    cv2.imshow("red",R)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Colorsplit(bgr)#将转换前的RGB图像颜色通道分离

bgr2 = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
cv2.imshow("after",bgr2)
cv2.waitKey(0)
cv2.destroyAllWindows()

Colorsplit(bgr2)#将转换后的RGB图像颜色通道分离

案例三 将图像在BGR模式与HSV模式之间转换

hsv=cv2.cvtColor(bgr,cv2.COLOR_BGR2HSV)#转换为HSV颜色空间
cv2.imshow("HSV",hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()

任务二:提取指定颜色

OpenCV图像处理技术之色彩空间与几何变换_第3张图片

  • 案例一 提取pig.jpg图像中的红色区域

import cv2
import numpy as np

img2=cv2.imread("pig.jpg")
cv2.imshow("SRC",img2)
hsv = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)#图像类型转换函数
cv2.imshow("HSV",hsv)

lowerb_hsv = np.array([156,43,46])#要识别颜色的下限
upperb_hsv = np.array([180,255,255])#要识别的颜色的上限

mask = cv2.inRange(hsv, lowerb_hsv, upperb_hsv)
cv2.imshow("MASK",mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

red = cv2.bitwise_and(img2,img2,mask=mask)
cv2.imshow("RED",red)
cv2.waitKey(0)
cv2.destroyAllWindows()

  • 任务三:简单的几何变换

  • 几何变换是指将一幅图像映射到另外一幅图像内的操作。 本任务主要介绍的映射关系划分为缩放、翻转、仿射、透视、重映射等。
  • 案例一 图像缩放

import cv2
import numpy as np

img=cv2.imread("pig.jpg")
rows,cols,_ = img.shape

#第一种缩放方式
size1 = (int(rows*0.9),int(cols*0.8))#宽变成0.9倍,长变成0.8倍
img_resize1 = cv2.resize(img,size1)

#第二种缩放方式
img_resize2 = cv2.resize(img,None,fx=2,fy=1.5)#宽变成两倍,长变成1.5倍
cv2.imshow("SRC",img)
cv2.imshow("RESIZE1",img_resize1)
cv2.imshow("RESIZE2",img_resize2)
cv2.waitKey(0)
cv2.destroyAllWindows()​​​​​​​

  • 案例二 图像翻转

img_flip1=cv2.flip(img,0)#x轴翻转
cv2.imshow("FLIP1",img_flip1)
cv2.waitKey(0)
cv2.destroyAllWindows()​​​​​​​

  • 案例三 图像仿射变换

平移

rows,cols,_ = img.shape
x = 100
y = 200
M = np.float32([[1,0,x],[0,1,y]])#转换矩阵
img_move=cv2.warpAffine(img,M,(cols,rows))#平移操作,注意(cols,rows)
cv2.imshow("MOVE",img_move)
cv2.waitKey(0)
cv2.destroyAllWindows()
​​​​​​​

  • 旋转
  1. 语法:retval = cv2.getRotationMatrix2D(center,anle,scale)
  • center:旋转中心
  • angle:旋转角度,正数为逆时针旋转,负数为顺时针旋转

    scale:缩放大小

height,width,_ = img.shape
M = cv2.getRotationMatrix2D((width/2, height/2), 45, 0.6)
img_rotate=cv2.warpAffine(img,M,(width, height))#平移操作
cv2.imshow("ROTATE",img_rotate)
cv2.waitKey(0)
cv2.destroyAllWindows()​​​​​​​

  • 案例四 透视

语法1:

转换矩阵 M = cv2.getPerspectiveTransform(pts_o, pts_d)

pts_o为原始4个点坐标

pts_d为变换后4个点坐标

语法2:

dst = cv2.warpPerspective(img, M, dsize)

img为原图

dst为变换后的图

M为转换矩阵

dsize为变换后图像的大小

#读图
img = cv2.imread('shudu.jpg')
rows, cols,_ = img.shape

# 原始点阵
pts_o = np.float32([[88, 177], [716, 85], [216, 695], [957, 551]]) # 这四个点为原始图片上数独的位置
pts_d = np.float32([[0, 0], [600, 0], [0, 600], [600, 600]]) # 这是变换之后的图上四个点的位置

# 获取转换矩阵
M = cv2.getPerspectiveTransform(pts_o, pts_d)
# 应用变换
dst = cv2.warpPerspective(img, M, (600, 600)) # 最后一参数是输出dst的尺寸。可以和原来图片尺寸不一致。按需求来确定

cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()​​​​​​​

  • 今天的学习到此结束了,今天木有任务噢!
  • 下次见!拜拜!

你可能感兴趣的:(opencv)