当前位置:   article > 正文

基于OpenCV-python的图像增强和滤波_cv2 增强图片

cv2 增强图片

目录

彩色空间

直方图均衡化

图像滤波

梯度


一、彩色空间

OpenCV 的颜色空间主要有 BGR、HSV、Lab等,cvtColor 函数可以让图像在不同颜色空间转换。例如通过将花的图像转换到 HSV 颜色空间,在HSV空间内过滤出只含有花瓣颜色的像素,从而提取出花瓣。

  1. import numpy as np
  2. import cv2
  3. if __name__ == '__main__':
  4. flower = cv2.imread('flower.jpeg', -1)
  5. hsv = cv2.cvtColor(flower, cv2.COLOR_BGR2HSV)
  6. lower_red = np.array([0, 20, 100])
  7. upper_red = np.array([10, 255, 255])
  8. mask = cv2.inRange(hsv, lower_red, upper_red)
  9. res = cv2.bitwise_and(flower, flower, mask=mask)
  10. images = np.concatenate((flower, res), axis=1)
  11. cv2.imshow('flower', images)
  12. cv2.waitKey()
  13. cv2.destroyAllWindows()

二、直方图均衡化

通过调整图像的直方图调整图像的整体细节实现如下效果,下图左图是浑水鱼,右边清澈鱼。

  

  1. import numpy as np
  2. import cv2
  3. if __name__ == '__main__':
  4. fish = cv2.imread('fish.jpeg', -1)
  5. b, g, r = cv2.split(fish)
  6. bx, gx, rx = cv2.equalizeHist(b), cv2.equalizeHist(g), cv2.equalizeHist(r)
  7. fish_enhance = cv2.merge((bx, gx, rx))
  8. images = np.concatenate((fish, fish_enhance), axis=1)
  9. cv2.imwrite('fish_enhance.jpeg', images)
  10. cv2.imshow('fish_enhance', images)
  11. cv2.waitKey()
  12. cv2.destroyAllWindows()

三、图像滤波

图像滤波是在尽可能保留图像细节特征的条件下对目标图像的噪声进行抑制,是常用的图像预处理操作。平滑滤波也称为低通滤波,可以抑制图像中的灰度突变,使图像变得模糊,是低频增强的空间域滤波技术。盒式核是最简单的可分离低通滤波器核。盒式核结构简单,模板区域中各像素点的系数相同。OpenCV 提供了函数 cv.boxFilter() 可以实现直方图均衡化

函数说明:

cv.boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]]) → dst

简单的代码实现如下: 

  1. import cv2 as cv
  2. if __name__ == '__main__':
  3. img = cv.imread("Lena.png")
  4. ksize = (5, 5)
  5. imgBoxFilter = cv.boxFilter(img, -1, ksize=ksize)
  6. cv.imshow("BoxFilter", imgBoxFilter)
  7. key = cv.waitKey(0)

 四、梯度

在图像处理中,梯度反映了像素值的最大变化率的方向,能够突出和提取边缘,常用于工业检测中产品缺陷检测和自动检测的预处理。

OpenCV 提供了三种梯度算子:Sobel、Scharr 和 Laplacian。Sobel 梯度算子是高斯平滑和微分求导的联合运算,抗噪声能力强。

Sobel 梯度算子很容易通过卷积操作 cv.filter2D 实现,OpenCV 也提供了函数 cv.Sobel 实现 Sobel 梯度算子。

函数说明:

cv.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]) → dst

我们用 Sobel 算子从 Lena 图像提取边缘,看看会产生什么样的效果吧。

 实现代码如下:

  1. import cv2 as cv
  2. if __name__ == '__main__':
  3. img = cv.imread("lena.png", flags=1)
  4. imgGray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
  5. SobelX = cv.Sobel(imgGray, cv.CV_16S, 1, 0) # 计算 x 轴方向
  6. SobelY = cv.Sobel(imgGray, cv.CV_16S, 0, 1) # 计算 y 轴方向
  7. absX = cv.convertScaleAbs(SobelX) # 转回 uint8
  8. absY = cv.convertScaleAbs(SobelY) # 转回 uint8
  9. SobelXY = cv.addWeighted(absX, 0.5, absY, 0.5, 0) # 用绝对值近似平方根
  10. cv.imshow("Sobel gradient", SobelXY)
  11. cv.waitKey(0)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/975363
推荐阅读
相关标签
  

闽ICP备14008679号