图像认知与OpenCV——图像预处理

发布于:2025-07-25 ⋅ 阅读:(15) ⋅ 点赞:(0)

目录

一、颜色加法

颜色加法

颜色加权加法

示例

二、颜色空间转换 

RGB转Gray(灰度)

RGB转HSV

HSV转RGB

示例

三、灰度化

最大值法

平均值法

加权平均值法

四、图像二值化处理

 阈值法

反阈值法

截断阈值法

低阈值零处理

超阈值法

OTSU

自适应二值化

均值

加权求和

五、图像翻转

总结


一、颜色加法

可以使用OpenCV的cv.add()函数把两幅图像相加,或者可以简单地通过numpy操作添加两个图像,如res = img1 + img2。两个图像应该具有相同的大小和类型。

颜色加法

OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作,而Numpy添加是模运算。

# 饱和操作: cv.add(img1,img2)
# Numpy直接相加是取模运算,如250+10 = 260%256 = 4
x = np.uint8([[250]])
y = np.uint8([[10]])
xy1 = cv.add(x,y)
xy2 = x + y
print(xy1,xy2)

xy1采用OpenCV中的饱和运算,最大值为255,因为250+10=260>255,所以xy1=255

xy2采用Numpy的加法,采用去摸运算,结果与256取模运算,260%255=4,所以xy2=4

颜色加权加法

cv.addWeighted(img1,alpha,img2,beta,gamma)
结果:img1*alpha+img2*beta+gamma

img1,img2为图片数据(数组)

alpha,beta为权重

gamma为亮度调整值

  • gamma > 0,图像会变亮。

  • gamma < 0,图像会变暗。

  • gamma = 0,则没有额外的亮度调整。

示例

import cv2 as cv
import numpy as np

# 读取图片
cao = cv.imread("../images/cao.png")
pig = cv.imread("../images/pig.png")
# 饱和操作: cv.add(img1,img2)
dst1 = cv.add(cao,pig)
# print(cao)
# print(pig)
# print(dst1)
cv.imshow('dst1',dst1)

# Numpy直接相加是取模运算,如250+10 = 260%256 = 4
dst2 = cao + pig
cv.imshow('dst2',dst2)

# 颜色加权加法: cv.addWeighted(img1,alpha,img2,beta,gamma) : img1*alpha+img2*beta+gamma
dst3 = cv.addWeighted(pig,0.7,cao,0.3,0)
cv.imshow('dst3',dst3)


cv.waitKey(0)
cv.destroyAllWindows()

二、颜色空间转换 

cv.cvtColor(img,code)

RGB转Gray(灰度)

code = cv.COLOR_BGR2GRAY

RGB转HSV

code = cv.COLOR_BGR2HSV

HSV转RGB

code = cv.COLOR_BGR2RGB

示例

import cv2 as cv
# 读取图片
img = cv.imread("../images/1.jpg")
# 颜色转换 cv.cvtColor(img,code)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow('gray',gray)
# 转HSV
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
cv.imshow('hsv',hsv)
# 转RGB
rgb = cv.cvtColor(img,cv.COLOR_BGR2RGB)
cv.imshow('rgb',rgb)

cv.waitKey(0)
cv.destroyAllWindows()

三、灰度化

最大值法

对于彩色图像的每个像素,它会从R、G、B三个通道的值中选出最大的一个,并将其作为灰度图像中对应位置的像素值。

import cv2 as cv
import numpy as np

# 读取图片
pig = cv.imread("../images/pig.png")
img = np.zeros((pig.shape[0],pig.shape[1]),dtype=np.uint8)
# 循环遍历
for i in range(pig.shape[0]):
    for j in range(pig.shape[1]):
        img[i,j] = max(pig[i,j,:])
cv.imshow("img",img)
cv.waitKey(0)
cv.destroyAllWindows()

平均值法

对于彩色图像的每个像素,它会将R、G、B三个通道的像素值全部加起来,然后再除以三,得到的平均值就是灰度图像中对应位置的像素值。

import cv2 as cv
import numpy as np

# 读取图片
pig = cv.imread("../images/pig.png")
img = np.zeros((pig.shape[0],pig.shape[1]),dtype=np.uint8)
# 循环遍历
for i in range(pig.shape[0]):
    for j in range(pig.shape[1]):
        # int():转为更大的数据类型,防止溢出
        img[i,j] = (int(pig[i,j,0])+int(pig[i,j,1])+int(pig[i,j,2]))//3

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

注:图像数据都是整数,需要转换为int型,结果也必须为整数,所以整除

加权平均值法

对于彩色图像的每个像素,它会按照一定的权重去乘以每个通道的像素值,并将其相加,得到最后的值就是灰度图像中对应位置的像素值。

import cv2 as cv
import numpy as np

# 读取图片
pig = cv.imread("../images/pig.png")
img = np.zeros((pig.shape[0],pig.shape[1]),dtype=np.uint8)
# 定义权重
wb,wg,wr=0.114,0.587,0.299

# 循环遍历
for i in range(pig.shape[0]):
    for j in range(pig.shape[1]):
        img[i,j] = round(wb*pig[i,j,0])+round(wg*pig[i,j,1])+round(wr*pig[i,j,2])

cv.imshow("img",img)
cv.waitKey(0)
cv.destroyAllWindows()

四、图像二值化处理

将某张图像的所有像素改成只有两种值之一

操作的图像必须为灰度图,所以处理前需要进行灰度化处理

_,binary = cv2.threshold(img,thresh,maxval,type)

  • img:输入图像,要进行二值化处理的灰度图。

  • thresh:设定的阈值。当像素值大于(或小于,取决于阈值类型)thresh时,该像素被赋予的值。

  • type:阈值处理的类型。

  • 返回值:

    • 第一个值(通常用下划线表示):计算出的阈值,若使用自适应阈值法,会根据算法自动计算出这个值。

    • 第二个值(binary):二值化后的图像矩阵。与输入图像尺寸相同。

 阈值法

将灰度图中的每一个像素值与该阈值进行比较,小于等于阈值的像素就被设置为0(通常代表背景),大于阈值的像素就被设置为maxval

type = cv.THRESH_BINARY

反阈值法

与阈值法相反。反阈值法是当灰度图的像素值大于阈值时,该像素值将会变成0(黑),当灰度图的像素值小于等于阈值时,该像素值将会变成maxval

type = cv.THRESH_BINARY_INV

截断阈值法

截断阈值法,指将灰度图中的所有像素与阈值进行比较,像素值大于阈值的部分将会被修改为阈值,小于等于阈值的部分不变

type = cv.THRESH_TRUNC

低阈值零处理

低阈值零处理,像素值小于等于阈值的部分被置为0(也就是黑色),大于阈值的部分不变。

type = cv.THRESH_TOZERO

超阈值法

超阈值零处理,与低阈值零处理相反,就是将灰度图中的每个像素与阈值进行比较,像素值大于阈值的部分置为0,像素值小于等于阈值的部分不变

type = cv.THRESH_TOZERO_INV

OTSU

OTSU算法就是在灰度图的像素值范围内遍历阈值T,使得g最大,基本上双峰图片的阈值T在两峰之间的谷底。

g就是前景与背景两类之间的方差,这个值越大,说明前景和背景的差别就越大,效果就越好。

THRESH_OTSU 通常与 THRESH_BINARYTHRESH_BINARY_INV 结合使用。

type = cv.THRESH_BINARY+cv.THRESH_OTSU  或 cv.THRESH_BINARY_INV+cv.THRESH_OTSU

手动设置的thresh值无效,阈值通过OTSU函数自动计算

自适应二值化

自适应二值化更加适合用在明暗分布不均的图片

自适应二值化方法会对图像中的所有像素点计算其各自的阈值

与OTSU类似,必须且只能结合一个阈值法或反阈值法

cv2.adaptiveThreshold(image_np_gray, maxval , cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, blockSize , c)

  • blockSize:选取的小区域的面积,如7就是7*7的小块。
  • c:最终阈值等于小区域计算出的阈值再减去此值

均值

根据选中点一定范围内的平均值作为阈值

    加权求和

    根据高斯权重核求加权,对小区域内的像素进行加权求和得到新的阈值,其权重值来自于高斯分布

    五、图像翻转

    • cv2.flip(img,flipcode)

    • 参数

      • im. 要翻转的图像

      • flipcode: 指定翻转类型的标志

        • flipcode=0: 垂直翻转,图片像素点沿x轴翻转

        • flipcode>0: 水平翻转,图片像素点沿y轴翻转

        • flipcode<0: 水平垂直翻转,水平翻转和垂直翻转的结合

    示例 

    import cv2 as cv
    
    # 读取图片
    face = cv.imread("../images/face.png")
    cv.imshow("face",face)
    # 图像翻转/镜像旋转 : 以图像中心为原点  cv.flip(img,flipCode)
    # flipCode = 0 : 垂直翻转
    flip_0 = cv.flip(face,0)
    cv.imshow('flip_0', flip_0)
    # flipCode = 1 : 水平翻转
    flip_1 = cv.flip(face,1)
    cv.imshow('flip_1', flip_1)
    # flipCode = -1 : 水平垂直翻转
    flip_2 = cv.flip(face,-1)
    cv.imshow('flip_2',flip_2)
    
    
    cv.waitKey(0)
    cv.destroyAllWindows()

     效果

    总结

    本文介绍了图像预处理中的一些内容,颜色加法包括平均值和加权加法,其中平均值包括OpenCV饱和加法与Numpy模运算加法;颜色空间转换包括灰度、RGB、HSV三者的转换;灰度化处理包括最大值法、平均值法、加权平均值法;图像二值化处理包括5种阈值方法和自适应二值化;图像反转包括水平翻转、垂直翻转、双向翻转。

    以上就是本章所有内容,感谢观看。


    网站公告

    今日签到

    点亮在社区的每一天
    去签到