OpenCV(02)图像颜色处理,灰度化,二值化,仿射变换

图像颜色加法

  • 颜色加法

    import cv2 as cv
    import numpy as np

    #读图
    cao = cv.imread('E:\hqyj\code\opencv\images\cao.png')
    pig = cv.imread('E:\hqyj\code\opencv\images\pig.png')
    #饱和操作 cv.add(img1,img2) np.uint8
    dst1 = cv.add(cao,pig)
    #numpy直接相加 取模运算 对256取模 250+10=4
    dst2 = cao+pig

    print(cao)

    print(pig)

    print(dst1)

    cv.imshow('dst1',dst1)
    cv.imshow('dst2',dst2)

    x = np.uint8([[250]])
    y = np.uint8([[10]])
    xy1 = cv.add(x,y)
    xy2 = x+y
    print(xy1)
    print(xy2)

    dst3 = cv.addWeighted(cao,0.2,pig,0.8,0)
    cv.imshow('dst3',dst3)

    cv.waitKey(0)
    cv.destroyAllWindows()

  • 图像转换

    import cv2 as cv
    import numpy as np

    读取图片

    img = cv.imread('E:\hqyj\code\opencv\images\pig.png')

    颜色转换 cv.cvtColor(img, cv.COLOR_BGR2HSV)->图像,转换方式

    灰度图

    gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    cv.imshow('gray',gray)

    转hsv

    hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
    cv.imshow('hsv',hsv)

    bgr转rgb

    rgb = cv.cvtColor(img,cv.COLOR_BGR2RGB)
    cv.imshow('rgb',rgb)

    cv.waitKey(0)
    cv.destroyAllWindows()

灰度化

  • 最大值法

    import cv2 as cv
    import numpy as np

    #读取图像
    pig = cv.imread('E:\hqyj\code\opencv\images\pig.png')
    shape = pig.shape #(h,w,c)
    img = np.zeros((shape[0],shape[1]),dtype = np.uint8)
    #for循环遍历像素点
    for i in range(shape[0]):
    for j in range(shape[1]):
    img[i,j] = max(pig[i,j,0],pig[i,j,1],pig[i,j,2])
    cv.imshow('grey',img)
    cv.waitKey(0)
    cv.destroyAllWindows()

  • 平均值法

    import cv2 as cv
    import numpy as np

    #读取图像
    pig = cv.imread('E:\hqyj\code\opencv\images\pig.png')
    shape = pig.shape #(h,w,c)
    img = np.zeros((shape[0],shape[1]),dtype = np.uint8)
    #for循环遍历像素点
    for i in range(shape[0]):
    for j in range(shape[1]):
    #将int():转换为更大的类型,防止溢出
    img[i,j] =np.uint8((int(pig[i,j,0])+int(pig[i,j,1])+int(pig[i,j,2]))/3)
    cv.imshow('grey',img)
    cv.waitKey(0)
    cv.destroyAllWindows()

  • 加权平均值法

    import cv2 as cv
    import numpy as np

    #读取图像
    pig = cv.imread('E:\hqyj\code\opencv\images\pig.png')
    shape = pig.shape #(h,w,c)
    img = np.zeros((shape[0],shape[1]),dtype = np.uint8)
    #定义权重
    wb,wg,wr = 0.114,0.587,0.299
    #for循环遍历像素点
    for i in range(shape[0]):
    for j in range(shape[1]):
    #将int():转换为更大的类型,防止溢出
    img[i,j] = round((wb * pig[i,j,0] + wg * pig[i,j,1] + wr * pig[i,j,2])//3)

    cv.imshow('grey',img)
    cv.waitKey(0)
    cv.destroyAllWindows()

二值化

  • 二值化(阈值法)格式:阈值法:
    _,binary = cv2.threshold(img,thresh,maxval,type)
    _binary:cv2.threshold 函数返回两个值:一个是计算出的最佳阈值(retval),另一个是阈值处理后的图像(binary),_ 被用来忽略返回值中的第一个元素,即计算出的最佳阈值
    img:输入图像,要进行二值化处理的灰度图。
    thresh:设定的阈值。当像素值大于(或小于,取决于阈值类型)thresh时,该像素被赋予的值。
    type:阈值处理的类型。

  • 自适应二值化格式:
    cv2.adaptiveThreshold(image_np_gray, maxval, adaptiveMethod, thresholdType, blockSize, c)
    其中各个参数的含义如下:
    maxval:最大阈值,一般为255
    adaptiveMethod:小区域阈值的计算方式:
    ADAPTIVE_THRESH_MEAN_C:小区域内取均值
    ADAPTIVE_THRESH_GAUSSIAN_C:小区域内加权求和,权重是个高斯核
    thresholdType:二值化方法,只能使用THRESH_BINARY、THRESH_BINARY_INV,也就是阈值法和反阈值法
    blockSize:选取的小区域的面积,如7就是7*7的小块。(只能取奇数)
    c:最终阈值等于小区域计算出的阈值再减去此值

    import cv2 as cv

    #读图
    flower = cv.imread('E:\hqyj\code\opencv\images\flower.png')
    #灰度化处理
    gray = cv.cvtColor(flower,cv.COLOR_BGR2GRAY)
    gray = cv.resize(gray,(360,360))
    cv.imshow('1.gray',gray)

    #二值化 1.阈值法 cv.THRESH_BINARY
    thresh,binary = cv.threshold(gray,127,255,cv.THRESH_BINARY)
    print(thresh)
    cv.imshow('2.binary',binary)

    #2.反阈值法 cv.THRESH_BINARY_INV
    _,binary_inv = cv.threshold(gray,127,255,cv.THRESH_BINARY_INV)
    cv.imshow('3.binary_inv',binary_inv)

    #3.截断阈值法 cv.THRESH_TRUNC
    _,binary_trunc = cv.threshold(gray,170,255,cv.THRESH_TRUNC)
    cv.imshow('4.binary_trunc',binary_trunc)

    #4.低阈值零处理法 cv.THRESH_TOZERO
    _,binary_tozero = cv.threshold(gray,127,255,cv.THRESH_TOZERO)
    cv.imshow('5.binary_tozero',binary_tozero)

    #5.超阈值零处理法 cv.THRESH_TOZERO_INV
    _,binary_tozero_inv = cv.threshold(gray,127,255,cv.THRESH_TOZERO_INV)
    cv.imshow('6.binary_tozero_inv',binary_tozero_inv)

    #6.OTSU阈值法
    shresh1,otsu=cv.threshold(gray,200,255,cv.THRESH_OTSU)
    #7.OTSU+反阈值法
    shresh2,otsu_inv = cv.threshold(gray,shresh1,255,cv.THRESH_BINARY_INV)
    print(shresh1)
    print(shresh2)
    cv.imshow('7.otsu',otsu)

    #自适应二值化 小区域计算 必须只能结合阈值法或反阈值法
    #1.取均值
    binary_adaptive = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,7,10)
    #2.加权求和法 高斯核
    adaptive_binary = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,11,10)
    cv.imshow('8.binary_adaptive',binary_adaptive)
    cv.imshow('9.adaptive_binary',adaptive_binary)

    cv.waitKey(0)
    cv.destroyAllWindows()

仿射变换

  • 仿射变换流程
    1.读图cv.imread(),调尺寸cv.resize()
    2.获取仿射变换矩阵

    1.旋转:M = cv.getRotationMatrix2D(center,angle,scale)
    center:旋转中心点的坐标,格式为(x,y)
    angle:旋转角度,单位为度,正值表示逆时针旋转负值表示顺时针旋转。
    scale:缩放比例,若设为1,则不缩放。
    2.平移:M = np.float32([[1,0,tx],[0,1,ty]])
    3.缩放:M = np.float32([[sx,0,0],[0,sy,0]])
    4.剪切:M = np.float32([[shx,1,0],[1,shy,0]])

  • 旋转

    import cv2 as cv

    #读图
    cat = cv.imread('E:\hqyj\code\opencv\images\cat1.png')
    cat = cv.resize(cat,(520,520))
    #获取旋转矩阵 cvv2.getRotationMatrix2D(center,angle,scale) 2x3
    M = cv.getRotationMatrix2D((260,260),-45,1)
    #仿射变换函数 cv.warpAffine(img,M,(w,h))
    img = cv.warpAffine(cat,M,(520,520))
    cv.imshow('img',img)
    cv.waitKey(0)
    cv.destroyAllWindows()

  • 平移

    import cv2 as cv
    import numpy as np

    #读图
    cat = cv.imread('E:\hqyj\code\opencv\images\cat1.png')
    cat = cv.resize(cat,(520,520))
    #定义平移量
    tx,ty = 80,120
    #定义平移矩阵
    M = np.float32([[1,0,tx],[0,1,ty]])
    #仿射变换函数 M = cv.warpAffine(img,M,(w,h))
    img = cv.warpAffine(cat,M,(520,520))
    cv.imshow('img',img)
    cv.waitKey(0)
    cv.destroyAllWindows()

  • 缩放

    import cv2 as cv
    import numpy as np

    #读图
    cat = cv.imread('E:\hqyj\code\opencv\images\cat1.png')
    cat = cv.resize(cat,(520,520))
    #定义缩放量
    sx,sy = 0.5,0.5
    #定义缩放矩阵
    M = np.float32([[sx,0,0],[0,sy,0]])
    #仿射变换函数 cv.warpAffine(img,M,(w,h))
    img = cv.warpAffine(cat,M,(520,520))
    cv.imshow('img',img)
    cv.waitKey(0)
    cv.destroyAllWindows()

  • 剪切

    import cv2 as cv
    import numpy as np

    #读图
    cat = cv.imread('E:\hqyj\code\opencv\images\cat1.png')
    cat = cv.resize(cat,(520,520))
    #定义缩放量
    shx,shy = 0.5,0.5
    #定义缩放矩阵
    M = np.float32([[shx,1,0],[1,shy,0]])
    #仿射变换函数 cv.warpAffine(img,M,(w,h))
    img = cv.warpAffine(cat,M,(520,520))
    cv.imshow('img',img)
    cv.waitKey(0)
    cv.destroyAllWindows()

相关推荐
coding者在努力几秒前
从零开始:用PyTorch实现线性回归模型
人工智能·pytorch·线性回归
Giser探索家6 分钟前
低空智航平台技术架构深度解析:如何用AI +空域网格破解黑飞与安全管控难题
大数据·服务器·前端·数据库·人工智能·安全·架构
静心问道6 分钟前
CacheBlend:结合缓存知识融合的快速RAG大语言模型推理服务
人工智能·语言模型·模型加速
云卓SKYDROID9 分钟前
无人机智能返航模块技术分析
人工智能·数码相机·无人机·高科技·云卓科技
独行soc35 分钟前
2025年大模型安全岗的面试汇总(题目+回答)
android·人工智能·安全·面试·职场和发展·渗透测试
CONDIMENTTTT40 分钟前
[机器学习]07-基于多层感知机的鸢尾花数据集分类
人工智能·机器学习
数据知道1 小时前
机器翻译:Hugging Face库详解
人工智能·自然语言处理·机器翻译
Blossom.1181 小时前
把大模型当“温度计”——基于 LLM 的分布式系统异常根因定位实战
人工智能·python·深度学习·机器学习·自然语言处理·分类·bert
adminwolf1 小时前
支持小语种的在线客服系统,自动翻译双方语言,适合对接跨境海外客户
人工智能·自然语言处理·机器翻译
guidovans1 小时前
基于大语言模型的爬虫数据清洗与结构化
人工智能·爬虫·语言模型·自然语言处理