openCV-Task06:21-24 21:图像直方图;22:图像直方图均衡化:23:图像卷积操作:24:高斯模糊

目录

图像直方图

函数及参数

代码实现 

运行结果

 直方图均衡化

函数及参数

 代码实现

运行结果

 图像卷积

我的理解

卷积的边缘填充函数

 cv图像卷积模糊函数

 代码实现

运行结果

 高斯模糊

代码实现 

运行结果


图像直方图

根据灰度值分成不同的等级,然后统计出现的频数。
三个通道三个不同的直方图分布。

函数及参数

calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) -> hist
images表示图像
channels表示通道
mask 默认None
histSzie表示bin的个数
ranges表示通道的取值范围


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

代码实现 

    image = cv.imread(".\\data\\girl.jpg")
    cv.imshow("input",image)
    color = ('blue','green','red')
    for i, color in enumerate(color):
        hist = cv.calcHist([image],[i],None,[32],[0,255]) # 将256个像素值分成32个range
        print(hist.dtype)
        plt.plot(hist, color=color)
        plt.xlim([0, 32])
    plt.show()

    cv.waitKey(0)
    cv.destroyAllWindows()

运行结果

 直方图均衡化

把图像直方图后,将分成的8个bin映射到8个等级上,计算他占像素总数的比率,即概率。

函数及参数

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

 代码实现

    image = cv.imread(".\\data\\girl.jpg",cv.IMREAD_GRAYSCALE)
    cv.imshow("input", image)
    hist = cv.calcHist([image],[0], None,[32],[0,256])
    print(hist.dtype)
    plt.plot(hist, color="gray")
    plt.xlim([0,32])
    plt .show()
    cv.waitKey(0)

    eqimg = cv.equalizeHist(image)
    cv.imshow("eq",eqimg)
    hist = cv.calcHist([eqimg],[0], None,[32],[0,256])
    print(hist.dtype)
    plt.plot(hist, color="gray")
    plt.xlim([0,32])
    plt.show()
    cv.waitKey(0)
    cv.destroyAllWindows()

运行结果

均衡前的直方图
均衡后的直方图

 图像均衡化的优点:提升图像的对比度;改变图像的像素统计分布。

 图像卷积

我的理解

用卷积核对图像进行卷积操作,然后得到想要的显示图像。

卷积核相当于一个滤波器,可以对图像进行过滤处理,得到想要的图像的信息,丢弃不重要的信息。

也可以看做是矩阵相乘,卷积核可以看做是一个变换矩阵,对原矩阵进行变换。

卷积在神经网络中的作用实际上就是提取局部特征。

计算公式:

卷积的边缘填充函数

边缘处理,边缘填充的方式
cv.BORDER_DEFAULT gfedcb|abcdefgh|gfedcba  # 反向的像素
cv.BORDER_WRAP cdefgh|abcdefgh|abcdefg     # 正向的像素
cv.BORDER_CONSTANT iiiiii|abcdefgh|iiiiiii # 给边缘添加同一个像素值

 cv图像卷积模糊函数

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

公式: 

                            

 代码实现

    image = cv.imread(".\\data\\baboon.jpg")
    dst = np.copy(image)
    cv.imshow("input",image)
    h,w,c = image.shape
    # 手动实现卷积模糊函数 
    for row in range(1,h-1):
        for col in range(1,w-1):
            m = cv.mean(image[row-2:row+2,col-2:col+2])   # 均值模糊
            dst[row,col] = (int(m[0]),int(m[1]),int(m[2]))
    cv.imshow("convolution-demo",dst)
    # 使用openCV自带函数
    blured = cv.blur(image,(5,5), anchor=(-1, -1))
    cv.imshow("blur-demo", blured)

    cv.waitKey(0)
    cv.destroyAllWindows()

运行结果

原图

利用卷积实现的模糊
利用blur函数实现

 高斯模糊

cv.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) ->dst

 GaussianBlur函数的作用是用高斯滤波器来模糊一张图片,对输入的图像src进行高斯滤波后用dst输出。它将源图像和指定的高斯核函数做卷积运算。权重系数不同。

                                        

注意:

ksize 必须是正数而且是奇数
sigmaX 高斯核函数 X 方向标准方差
sigmaY 高斯核函数 Y 方向标准方差 , 默认 0
表示跟 sigmaX 相同,
ksize 0 表示从 sigmaX 计算生成 ksize ,ksize大于 0 表示从 ksize 计算生成 sigmaX
ksize与sigma换算公式:

代码实现 

    image = cv.imread(".\\data\\girl.jpg")
    cv.imshow("input",image)
    # Ksize和sigma选择一个就行
    g1 = cv.GaussianBlur(image,(0, 0),15) # 当选择sigma时ksize就为0,0
    g2 = cv.GaussianBlur(image,(15,15),15)# 选ksize,后面的sigma值会被忽略
    cv.imshow("GaussianBlur1",g1)
    cv.imshow("GaussianBlur2",g2)

    cv.waitKey(0)
    cv.destroyAllWindows()

运行结果

原图
指定sigma的高斯模糊图

指定ksize的高斯模糊图

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值