2022-12 opencv教程 task6

21 图像直方图

图像直方图定义

  • 直方图是数值数据分布的精确图形表示。它是一种条形图
  • 这是一个连续变量(定量变量)的概率分布的估计,并且被卡尔·皮尔逊(Karl Pearson)首先引入。
  • 人们把亮度分为0到255共256个数值,数值越大,代表的亮度越高。其中0代表纯黑色的最暗区域,255表示最亮的纯白色,而中间的数字就是不同亮度的灰色。
  • 为了构建直方图,第一步是将值的范围分段,即将整个值的范围分成一系列间隔,然后计算每个间隔中有多少值。 这些值通常被指定为连续的,不重叠的变量间隔。 间隔必须相邻,并且通常是(但不是必须的)相等的大小。
  • 从统计的角度讲,直方图是图像内灰度值的统计特性与图像灰度值之间的函数,直方图统计图像内各个灰度级出现的次数。
  • 图像直方图统计的可以是对描述图像有用的任何特征,如灰度值、梯度等。
  • 直方图是图像的一个统计特征,它具有旋转、缩放、平移不变性,被应用于灰度图像的阈值分割,对比度调整,颜色匹配等等。

图像直方图

  • 三个通道三个不同的直方图分布
  • dims: 需要统计的特征数目。例如 dims=1,表示仅统计灰度值
  • bins: 每个特征空间子区段的数目

图像直方图函数

calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) -> hist
- images 图像,需要[]
- channels 通道 -需要用中括号括起来,输入图像是灰度图像值是 [0],彩色图像可以是 [0],[1],[2],分别对应 B,G,R
- mask 默认None。当统计整幅图像的直方图时,设为None;统计图像某一部分的直方图时,需要掩码图像
- histSize 像素值间隔bin的个数,需要[]
- ranges 通道(像素值)的取值范围
- accumulate 累计标识

  • 默认值为False
  • 如果被设置为 True,则直方图在开始分配时不会被清零。
  • 该参数允许从多个对象中计算单个直方图,或者用于实时更新直方图。
  • 多个直方图的累积结果,用于一组图像计算直方图。

例子: hist = cv.calcHist([image], [i], None, [32], [0, 256])
- image 输入图像
- i 通道索引
- mask = None
- 表示分为32个bin
- 表示取值范围0~256

  • enumerate()是python的内置函数
  • enumerate在字典上是枚举、列举的意思
  • 对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值
  • enumerate多用于在for循环中得到计数

22 直方图均衡化

直方图均衡化

  • 64x64大小图像,八个Bin,8个级别,像素总数:4096
  • 8个级别,所以 k 是 0~7
  • 8个级别,中间有7个间隔,每个占 1/7,所以 r_k
  • 在一个区间里有多少像素,就是$n_k$
  • 当前区间像素数/像素总数,就是$n_k$/n
  • 均衡化就展示在 $S^k$,首先是 n_k/n的累加值,比如0区间就是 0+0.19 = 0.19,占 1/7,后面就是它的级别
  • 相同级别累加再算占比,就是$p_s$(s_k)
  • 均衡化作用。直方图均衡化是通过拉伸像素强度的分布范围,使得在0~255灰阶上的分布更加均衡。这种均衡化,既实现了灰度值统计上的概率均衡,也实现了人类视觉系统(Human Visual System, HVS)上的视觉均衡。
  • 提升对比度,达到改善图像主观视觉效果的目的。对比度较低的图像适合使用直方图均衡化方法来增加图像细节
  • 灰度图像支持
  • 直方图均衡化的算法主要包括两个步骤:
  1. 计算累计直方图。
  2. 对累计直方图进行区间转换

图像直方图

  • 三个通道三个不同的直方图分布

直方图均衡化函数

cv.equalizeHist(src[, dst])->dst
- src 必须是八位单通道图像
- dst返回结果图像,类型与src保持一致


23 图像卷积操作

图像卷积定义

  • 在计算机视觉领域中,数字图像是一个二维的离散信号,对数字图像做卷积操作其实就是利用卷积核(卷积模板)在图像上滑动,将图像点上的像素灰度值与对应的卷积核上的数值相乘,然后将所有相乘后的值相加作为卷积核中间像素对应的图像上像素的灰度值,并最终滑动完所有图像的过程。
  • 图像卷积是计算机视觉,图像处理领域经常用到的操作,比方说模糊操作(blurring),平滑操作(smoothing),以及边缘检测(edge detection)等都是卷积操作。卷积操作是计算机视觉以及图像处理领域中最重要以及最基础的操作之一。
  • 可以简单理解卷积是对两个矩阵进行按元素(element-weise)的乘法,然后再对得到的矩阵结果个元素求和。
  • 在实际中,卷积是这样的:
  1. 选取两个矩阵(需要一样的尺寸)。
  2. 两个矩阵对应的元素进行按元素的乘法(注意,不是点乘,就是基本乘法)
  3. 把元素相加。

卷积核跟锚定位置

  • 卷积核,系数跟窗口大小 核可以是任意M * N像素大小,其中M,N 是奇数。值得注意的是,大多数核是N*N矩阵。
  • 锚定位置,锚定输出像素点,在进行卷积处理的时候,卷积mask与对应的像素块点乘得到输出,把输出结果赋值给哪个像素点是由锚定参数anchor决定

卷积的边缘填充

  • 边缘处理,边缘填充的方式
  • cv.BORDER_DEFAULT gfedcb|abcdefgh|gfedcba
  • cv.BORDER_WRAP cdefgh|abcdefgh|abcdefg 边界换行
  • cv.BORDER_CONSTANT iiiiii|abcdefgh|iiiiii 常量边界

卷积模糊函数

cv.blur(src, ksize[, dst[, anchor[, borderType]]]) -> dst
- src 输入图像 CV_8U,CV_32F or CV_64F
- Ksize 卷积核大小
image
- Anchor 锚定位置 (-1,-1) 默认中心位置
- borderType 边缘处理方式

img = cv.imread("starry_night.jpg");
dst = np.copy(img)
cv.imshow("original", img)
h, w, c = img.shape
for row in range(2, h-2, 1): #从上到下 边缘进行原值处理
    for col in range(2, w-2, 1): #从左到右 边缘进行原值处理
        m = cv.mean(img[row-2:row+2, col-2:col+2]) #-2~+2, 5x5
        dst[row,col] = (int(m[0]),int(m[1]),int(m[2]))
cv.imshow("conv", dst)

blured = cv.blur(img, (5, 5), anchor=(-1,-1))#官方blur函数
cv.imshow("blured", blured)

cv.waitKey(0)
cv.destroyAllWindows()

24 高斯模糊

高斯模糊

  • 高斯模糊实质上就是一种均值模糊,只是高斯模糊是按照加权平均的,距离越近的点权重越大,距离越远的点权重越小。
  • 中心对称,不同权重,线性组合。高斯模糊产生的系数在中心最大,离中心越远系数越小。
  • 高斯模糊在美颜软件上挺常见的,专业图片处理工具也一定有,主要用在磨皮与毛玻璃效果上。

高斯函数

cv.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) -> dst
- ksize 高斯核的大小,格式为(w, h),必须是正数而且是奇数,因为高斯模糊是中心对称
- sigmaX 高斯核函数X方向标准方差
- sigmaY高斯核函数Y方向标准方差,默认0
- 表示跟sigmaX相同
- ksize = 0 表示从sigmaX计算生成ksize
- ksize > 0 表示从ksize计算生成sigmaX,
- 计算方式: δ=0.3 · ((size - 1) · 0.5 - 1) + 0.8

均值模糊与高斯模糊

  • 均值模糊 - 卷积核权重系数相同
  • 高斯模糊 - 卷积核根据高斯函数生成,权重系数不同
img = cv.imread("starry_night.jpg");
dst = np.copy(img)
cv.imshow("original", img)
dst1 = cv.GaussianBlur(img, (0, 0), 15)
dst2 = cv.GaussianBlur(img, (15, 15), 15)
cv.imshow("gauss1", dst1)
cv.imshow("gauss2", dst2)

cv.waitKey(0)
cv.destroyAllWindows()

浙ICP备19012682号