"""
在计算机视觉和图像处理领域,图像预处理是一个重要的步骤,它能够提高后续处理(如特征提取、目标检测等)的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法,以下是一些常见的图像预处理操作:
1. 图像空间转换
2. 图像大小调整
3. 图像仿射变换
4. 图像翻转
5. 图像裁剪
6. 图像二值化处理
7. 图像去噪
8. 边缘检测
9. 图像平滑处理
10. 图像形态学
"""
import cv2
import numpy as np

def demo1():# 图像翻转
    # cv2.flip 是 OpenCV 库中的一个函数,用于翻转图像。翻转可以是水平翻转、垂直翻转或同时水平和垂直翻转。这个函数接受两个参数:要翻转的图像和一个指定翻转类型的标志。 返回了一个新的图像矩阵
    # cv2.flip(src, flipCode[, dst]) -> dst # 传入的不是窗口 是图片矩阵
    # src:输入图像,可以是任意类型和深度的多通道图像。
    # flipCode
    # 指定翻转类型的整数标志:
    # 0:沿 X 轴翻转(垂直翻转)
    # 1:沿 Y 轴翻转(水平翻转)
    # -1:沿 X 轴和 Y 轴翻转(同时水平和垂直翻转)
    # st:可选参数,输出图像。如果未提供,输出图像将与输入图像具有相同的尺寸和类型。
    img=cv2.imread("../../assets/images/car.png")
    img2=cv2.flip(img,-1)
    cv2.imshow("img",img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
# 图像仿射变换 旋转 平移 缩放 剪切
# 仿射变换(Affine Transformation)是一种线性变换,它保持了点之间的相对距离不变,即平行线在变换后仍然保持平行。在图像处理中,仿射变换常用于旋转、缩放、平移和剪切等操作。
def rotate(): # 旋转    旋转操作可以将图像绕着某个点旋转一定的角度
    # cv2.getRotationMatrix2D是 OpenCV 库中的一个函数,用于获取旋转矩阵。这个函数主要用于图像的旋转变换。旋转矩阵是一个 2x3 的矩阵,可以用来将图像围绕指定的中心点旋转指定的角度,并且可以选择是否进行缩放。
    # cv2.getRotationMatrix2D(center, angle, scale) -> M
    # 要旋转要获得 被旋转图片的宽高 和设置选择中心 选择角度
    # center:旋转中心点的坐标,格式为 `(x, y)`。
    # angle:旋转角度,单位为度。正角度表示逆时针旋转,负角度表示顺时针旋转。
    # scale:缩放比例。如果设置为 1,则不进行缩放。
    # 返回值
    # M:2x3 的旋转矩阵。
    img = cv2.imread("../../assets/images/car.png")
    height,long=img.shape[:2] # 获得宽高
    center=(long//2,height//2) # 设置旋转中心
    angle=30 # 设置选择角度
    # 下面这个是获得一个旋转矩阵 相当于在定义选择操作 因为没有传入图片嘛
    M=cv2.getRotationMatrix2D(center=center,angle=angle,scale=1)
    # 下面进行图片旋转操作 传入图片的旋转矩阵(旋转定义),进行映射
    # 使用cv2.warpAffine(image, M, (w, h)) 传入 图片 旋转矩阵 生成图像的尺寸 返回一个新的图片矩阵
    img2=cv2.warpAffine(img,M,(long,height))
    cv2.imshow("img", img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
def translation():# 平移 就是要定一一个平移矩阵 平移规则 使用np的方法获得平移矩阵简单点(矩阵公式)
    # 要获得图像的宽高 定义xy的移动距离
    img = cv2.imread("../../assets/images/car.png")
    height, long = img.shape[:2]  # 获得宽高
    tx, ty = 200, 50 # 定义 xy移动距离
    # 获取平移矩阵 定义平移规则
    M = np.float32([[1, 0, tx], [0, 1, ty]]) # 固定格式 # 3 3
    # 进行 变换映射
    img2=cv2.warpAffine(img,M,(long,height))
    cv2.imshow("img", img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
def zoom():# 缩放 也是通过np来定义缩放规则
    img = cv2.imread("../../assets/images/car.png")
    height, long = img.shape[:2]  # 获得宽高
    # 定义缩放因子
    sx, sy = 1.5, 1.5
    M = np.float32([[sx, 0, 0], [0, sy, 0]]) # 1 2
    # 放大了生成的图像规格 也要放大相应的倍数 而且像素点必须为int型
    img2 = cv2.warpAffine(img, M, (int(sx*long), int(sy*height)))
    cv2.imshow("img", img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
def shear():# 剪切 不是裁剪 也np矩阵公式 来定义仿射规则 实际上是调整xy轴的夹角
    # 剪切操作可以改变图像的形状,使其在某个方向上倾斜
    img = cv2.imread("../../assets/images/car.png")
    height, long = img.shape[:2]  # 获得宽高
    # 定义剪切因子
    shx, shy = 0.2, 0.2
    M = np.float32([[1, shx, 0], [shy, 1, 0]]) # 2 1
    # 放大了生成的图像规格 也要放大相应的倍数 而且像素点必须为int型
    img2 = cv2.warpAffine(img, M, (long, height))
    cv2.imshow("img", img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 图像色彩空间转换 比如rgb转其他格式
"""
OpenCV中的色彩空间转换是将图像从一种颜色表示形式转换为另一种颜色表示形式的过程。常见的颜色空间包括RGB、HSV、YUV等。

色彩空间转换有几个重要的作用:

1. 方便图像处理:在不同的颜色空间中,对应的通道代表了不同的属性,例如在RGB空间中,红、绿、蓝三个通道分别代表了颜色的强度,而在HSV空间中,H(色相)代表了颜色的种类,S(饱和度)代表了颜色的深浅,V(亮度)代表了颜色的明暗。因此,对于不同的处理需求,选择不同的颜色空间进行处理可以更加方便。
2. 提高图像处理效果:在某些情况下,使用某些特定的颜色空间可以提高图像处理的效果。例如,在HSV空间中,可以通过调整S(饱和度)和V(亮度)来提高图像的对比度并去除噪点。
3. 节省计算资源:在某些情况下,使用特定的颜色空间可以帮助我们节省计算资源。例如,在RGB空间中,每个像素需要3个通道来表示,而在灰度空间中,每个像素只需要一个通道就可以表示。因此,如果我们只需要处理亮度信息而不需要颜色信息时,将图像转换为灰度空间可以节省计算资源。

总之,色彩空间转换在图像处理中是一项非常重要的技术,它可以方便我们对图像进行处理,并提高图像处理的效果和节省计算资源。

`cv2.cvtColor()`是OpenCV中的一个函数,用于图像颜色空间的转换。它可以将一个图像从一个颜色空间转换为另一个颜色空间,比如从RGB到灰度图像的转换,或者从BGR到HSV的转换等。
"""
# cv2.cvtColor(src, code) 得到一个新的图像
# - `src`:输入图像,可以是一个NumPy数组或者一个OpenCV的Mat对象。
# - `code`:指定转换的类型,可以使用预定义的转换代码,例如`cv2.COLOR_BGR2GRAY`表示从BGR到灰度图像的转换。
def demo2():# RGB 转 Gray(灰度)黑白图
    img = cv2.imread("../../assets/images/car.png")
    img2=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    cv2.imshow("img", img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
def demo3():# ### RGB 转 HSVRGB 转 HSV,HSV(Hue, Saturation, Value)色彩空间在颜色分割和颜色识别中非常有用。
    img = cv2.imread("../../assets/images/car.png")
    img2=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    cv2.imshow("img", img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 图像二值化处理 就是让图片只有两种颜色
# `cv2.threshold` 是 OpenCV 中用于图像二值化的函数。它通过设置阈值将图像分为前景和背景,常用于图像处理和分析。以下是该函数的主要功能和用法简介:功能
# `cv2.threshold` 将灰度图像转换为二值图像,根据指定的阈值将像素值分为两类:高于阈值的像素设为一个值(通常是255),低于阈值的像素设为另一个值(通常是0)。
# retval, dst = cv2.threshold(src, thresh, maxval, type)
# 1. **src**: 输入的灰度图像。
# 2. **thresh**: 阈值,决定分割的界限。
# 3. **maxval**: 当像素值超过阈值时,赋予的最大值(通常为255)。
# 4. type # 超过阈值后的处理
#    : 阈值类型,常用的有:
#    - `cv2.THRESH_BINARY`: 超过阈值的像素设为最大值,其余设为0。
#    - `cv2.THRESH_BINARY_INV`: 超过阈值的像素设为0,其余设为最大值。
#    - `cv2.THRESH_TRUNC`: 超过阈值的像素设为阈值,其余不变。
#    - `cv2.THRESH_TOZERO`: 超过阈值的像素不变,其余设为0。
#    - `cv2.THRESH_TOZERO_INV`: 超过阈值的像素设为0,其余不变。
# 返回值
# - **retval**: 实际使用的阈值(可能与输入值不同)。
# - **dst**: 输出的二值图像。
def demo4():
    img = cv2.imread("../../assets/images/car.png")

    # 转化为灰度图像
    img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 二值化处理
    retval, dst = cv2.threshold(img2, 150, 255, cv2.THRESH_BINARY)
    cv2.imshow("img", dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def demo5(): # 图像掩模     # 用来提取特定颜色 锁定需要的位置的坐标和宽高度
    # 它通常用于创建掩模,以便从图像中提取特定颜色的区域。
    # cv2.inRange(src, lowerb, upperb)
    # - src**: 输入的图像,可以是彩色图像或灰度图像。 hsv或者黑白
    # - **lowerb**: 颜色范围的下界(数组或元组),指定了要提取的颜色的最小值。 是hsv或者灰度的范围 不是rgb的  下界一个数组 上界一个数组 组成一个范围
    # - **upperb**: 颜色范围的上界(数组或元组),指定了要提取的颜色的最大值。
    # 返回值
    # 返回一个二值图像,白色部分表示在指定颜色范围内的区域,黑色部分表示不在范围内的区域
    img = cv2.imread("../../assets/images/car.png")
    img6=img
    img2 = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    # 定义上下界
    # 注意虽然图像在hsv里面是绿色  但是你百度的时候还是要搜蓝色的hsv值范围 搜的时候搜rgb颜色类型的
    # 如果返回的二值图像 特定区域外的白色太多应当适当调整范围 让其尽可能的减少
    lower=np.array([100,100,50])
    upper=np.array([140,255,255])
    # 创建掩膜
    img3=cv2.inRange(img2, lower, upper)
    # 在掩膜上进行轮廓读取
    contours, hierarchy = cv2.findContours(img3, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    # 画轮廓
    # img4=cv2.drawContours(img,contours,-1,(0,0,255),2)
    # cv2.boundingRect() 是 OpenCV 库中的一个方法,用于计算并返回包含指定点集(通常是轮廓)的最小矩形区域的坐标。这个方法非常有用,特别是在图像处理和计算机视觉任务中,当你需要确定某个物体或形状的边界框时。
    # findContours 返回的是一个点集 每一个点集都是一个边框 通过遍历它得到的每一个边框的点集再进行获得边框界 在绘制这个边框
    # 用这个得到xywh 然后画矩形
    # 参数
    # array:这是一个包含点集的 NumPy 数组。通常,这些点是通过一些图像处理方法(如 cv2.findContours())获得的轮廓点。
    # 返回值
    # 该方法返回一个包含四个整数的元组 (x, y, w, h),它们分别代表最小矩形区域的:
    # x:矩形左上角的 x 坐标。
    # y:矩形左上角的 y 坐标。
    # w:矩形的宽度。
    # h:矩形的高度。
    # 获得边框界 # 在每个轮廓上绘制最小外接矩形
    # img5=0
    img8=0
    for contour in contours:
        x, y, w, h=cv2.boundingRect(contour)
        # 这个可以打印xywh  宽高看最大的一个框 肯定就是最大的边界
        print(x, y,w, h)
        if w>100 and h>50:
            img5=cv2.rectangle(img,(x, y), (x + w, y + h),(0, 100, 0), 2)
            # 可以裁剪出来
            img8 = img5[y:y + h,x:x + w]
    # img7=cv2.rectangle(img6,(174, 179), (174 + 469, 179 + 235),(0, 100, 0), 2)

    cv2.imshow("img", img8)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    pass
def demo6():# 图像检测轮廓
    # cv2.findContours函数可以在二值图像中找到轮廓,并返回轮廓的点集。轮廓可以用来表示物体的边界,常用于物体检测、分割和形状分析。
    # contours, hierarchy = cv2.findContours(image, mode, method)
    # 1. **image**: 输入的二值图像。通常在调用该函数之前需要将图像转换为灰度图像并进行二值化处理(如使用 `cv2.threshold` 或 `cv2.Canny`)。
    # 2. mode 轮廓检索模式:
    #   cv2.RETR_EXTERNAL: 只检索外部轮廓。 也就是说在轮廓内部的轮廓不会返回。
    #   cv2.RETR_LIST: 检索所有轮廓,并将其放入列表中。
    #   cv2.RETR_TREE: 检索所有轮廓,并建立层级关系。
    # 3. method
    # 轮廓逼近方法:
    # cv2.CHAIN_APPROX_SIMPLE: 压缩轮廓,仅保留端点。
    # cv2.CHAIN_APPROX_NONE: 保留所有轮廓点。
    # 返回值
    # contours: 一个 Python 列表,其中每个元素是一个轮廓(即一组点),轮廓的点以 NumPy 数组的形式存储。
    # hierarchy: 轮廓的层级信息,包含轮廓之间的关系。
    # 一般要配合掩膜用 在二值图像或者掩膜上画轮廓然后再选择适当的 图像种类上显示 rgb hsv 灰度 二值
    # 转化为二值图像 要先灰度处理
    img = cv2.imread("../../assets/images/car.png")
    # 转化为灰度图像
    img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 二值化处理
    retval, dst = cv2.threshold(img2, 150, 255, cv2.THRESH_BINARY)
    # 检测轮廓
    contours, hierarchy = cv2.findContours(dst, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    # 检测完之后再绘制有轮廓的图像 有坐标了先转换为rgb图像 方便看
    # 画轮廓的方法
    # cv2.drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)
    # image:这是要在其上绘制轮廓的输入图像。
    # contours:这是一个 Python 列表,包含所有要绘制的轮廓。每个轮廓都是一个点集(通常是一个 NumPy 数组)。
    # contourIdx:指定要绘制的轮廓的索引。如果为负数(如 -1),则绘制所有轮廓。
    # color:轮廓的颜色。通常是一个 BGR(蓝、绿、红)颜色值,表示为 (B, G, R)。
    # thickness:轮廓的厚度。如果为负数(如 -1),则轮廓内部会被填充。 这个是轮廓有多宽 -1的话轮廓这个圈里面全都被涂了
    # 要先转回来bgr图像 ,现在是 二值化图像就是灰度图像
    # img3=cv2.cvtColor(dst,cv2.COLOR_GRAY2BGR)
    img3=cv2.drawContours(img,contours,-1,(0,0,255),2)
    cv2.imshow("img", img3)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    pass

if __name__=="__main__":
    # demo1()
    # rotate()
    # translation()
    # zoom()
    # shear()
    # demo3()
    # demo4()
    # demo5()
    # demo6()
    pass

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部