ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

OpenCV-python 图像变换操作

2022-05-19 18:32:02  阅读:279  来源: 互联网

标签:img show python cv2 50 OpenCV 图像 np color


 

一 颜色空间变换

当前版本的opencv颜色空间变换函数有274种,可以使用如下方法获取:

1 list_colorspace = [i for i in dir(cv2) if i.startswith('COLOR_')]
2 print("len(list_colorspace) = ", len(list_colorspace))

但常用的一般只有两个COLOR_BGR2GRAY和COLOR_BGR2HSV。

HSV颜色空间像素值范围,H:[0, 179],S:[0, 255],V:[0,255];其中H指色调,S饱和度,V亮度。

下面用HSV颜色空间进行目标提取,这里提取出蓝色目标,代码与结果如下:

import cv2
import numpy as np

def cv_show(img):
    cv2.imshow("Images", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img_color = cv2.imread("./3color.png", cv2.IMREAD_COLOR)
img_color = cv2.resize(img_color, (300,300))

# BGR转HSV
img_hsv = cv2.cvtColor(img_color, cv2.COLOR_BGR2HSV)

# 设定颜色范围
lower_blue = np.array([90,50,50])
upper_blue = np.array([120, 255, 255])

# 提取指定颜色范围mask
img_mask = cv2.inRange(img_hsv, lower_blue, upper_blue)

# 目标提取
img_obj = cv2.bitwise_and(img_color, img_color, mask=img_mask)
cv_show(img_obj)

# 颜色范围确定, 先获取纯色的hsv值,然后对下界在该值基础上变小, 上界只对色调进行适当提高就可以了。
if 1:
    blue = np.uint8([[[255, 0, 0]]]) # 相当于单个像素的图像
    hsv_blue = cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)
    print("hsv_blue = ", hsv_blue
)

 

 

 

 

 

二 空间几何变换

 

主要使用两个函数:cv2.warpAffine 和 cv2.warpPerspective;其中cv2.warpAffine使用2*3变换矩阵,cv2.warpPerspective使用3*3变换矩阵。

2.1 缩放

cv2.resize()实现缩放:

import cv2
import numpy as np

def cv_show(imgs):
    for index, img in enumerate(imgs):
        cv2.imshow("{}".format(index), img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img_path = "./3color.png"

img_color = cv2.imread(img_path, cv2.IMREAD_COLOR)
img_resize1 = cv2.resize(img_color, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
height, width = img_color.shape[:2]
img_resize2 = cv2.resize(img_color, (2*width, 2*height), interpolation=cv2.INTER_CUBIC)
cv_show([img_color, img_resize1, img_resize2])

上述是缩放的两种方式,默认参数是INTER_LINEAR,缩小时使用INTER_AREA效果较好放大时使用INTER_CUBIC(速度会慢)和INTER_LINEAR效果较好。

 

2.2 平移

import cv2
import numpy as np

def cv_show(imgs):
    for index, img in enumerate(imgs):
        cv2.imshow("{}".format(index), img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img_path = "./girl.png"

img_color = cv2.imread(img_path, cv2.IMREAD_COLOR)
# 2*3矩阵, x_new = 1*x + 0*y + bias_x, y_new = 0*x + 1*y + bias_y
M1 = np.float32([[1,0,100],[0,1,50]])
dst1 = cv2.warpAffine(img_color, M1, (img_color.shape[1], img_color.shape[0]))
cv_show([img_color, dst1])

 

 

 

 

 

2.3 旋转

import cv2
import numpy as np

def cv_show(imgs):
    for index, img in enumerate(imgs):
        cv2.imshow("{}".format(index), img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img_path = "./girl.png"

img_color = cv2.imread(img_path, cv2.IMREAD_COLOR)
rows, cols = img_color.shape[:2]

# 获取旋转矩阵
M = cv2.getRotationMatrix2D(((cols-1)/2.0, (rows-1)/2.0),40,1)
# 旋转变换
dst = cv2.warpAffine(img_color,M, (cols, rows))
cv_show([img_color, dst])

 

先通过设定的角度、中心获取旋转矩阵,然后再做图像变换,正角度逆时针旋转图像,负角度顺时针旋转图像。 

 

 

2.4 仿射变换

这里有两种方式:

方式一:warpAffine,输入图像选取3个点,输出图像选取3个点,使之一一对应,这样就有了对应关系,然后用cv2.getAffineTransform获取转换矩阵,再进行变换。

方式二:warpPerspective,输入图像选取3个点,输出图像选取3个点,使之一一对应,注意这里输入图像的4个点至少有3个点是不在一条直线的,然后用cv2.getPerspectiveTransform获取转换矩阵,再进行变换。

 

import cv2
import numpy as np

def cv_show(imgs):
    for index, img in enumerate(imgs):
        cv2.imshow("{}".format(index), img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img_path = "./girl.png"

img_color = cv2.imread(img_path, cv2.IMREAD_COLOR)
rows, cols = img_color.shape[:2]

# warpAffine方式
if 1:
    pts1 = np.float32([[50,50],[200,50],[50,200]])
    pts2 = np.float32([[10,100],[200,50],[100,250]])

    M = cv2.getAffineTransform(pts1, pts2)
    dst1 = cv2.warpAffine(img_color, M, (cols, rows))

# warpPerspective方式
if 1:
    pts1 = np.float32([[50,50],[200,50],[50,200], [200, 200]])
    pts2 = np.float32([[10,100],[200,50],[100,250], [300,200]])

    M = cv2.getPerspectiveTransform(pts1, pts2)
    dst2 = cv2.warpPerspective(img_color, M, (cols, rows))

cv_show([img_color, dst1, dst2])

 

 

 

标签:img,show,python,cv2,50,OpenCV,图像,np,color
来源: https://www.cnblogs.com/IllidanStormrage/p/16289638.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有