Opencv 图像处理笔记
- Author: Jing Yang
- Time: 2018/10/17
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import cv2
- load jpg format picture
- split into three channle
path=r'./Desktop/timg.jpg'
raw_img=cv2.imread(path)
b,g,r=cv2.split(raw_img)
1.CLAHE 限制对比度自适应直方图均衡化
clahe=cv2.createCLAHE(clipLimit=2,tileGridSize=(3,3))
def color_clahe(b,g,r):
cla_b=clahe.apply(b)
cla_g=clahe.apply(g)
cla_r=clahe.apply(r)
return cv2.merge((cla_r,cla_g,cla_b))
clahe_imge=color_clahe(b,g,r)
2.GaussianBlur 模糊
def gause(b,g,r):
gau_b=cv2.GaussianBlur(b,(9,9),5)
gau_g=cv2.GaussianBlur(g,(9,9),5)
gau_r=cv2.GaussianBlur(r,(9,9),5)
return cv2.merge((gau_r,gau_g,gau_b))
gause_blur_img=gause(b,g,r)
plt.imshow(gause_blur_img)
plt.show()
3.Soble 算子
- 备注:sobel算子在一个轴上进行非归一化的高斯平滑,在另一个坐标轴方向上做差分处理
- dst = cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])
- 前四个是必须的参数:
- 第一个参数是需要处理的图像;
- 第二个参数是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度;
- dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、2。
- 其后是可选的参数:
- dst不用解释了;
- ksize是Sobel算子的大小,必须为1、3、5、7。
- scale是缩放导数的比例常数,默认情况下没有伸缩系数;
- delta是一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中;
- borderType是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。
gray_img=cv2.imread(path,0)
x = cv2.Sobel(gray_img,cv2.CV_16S,1,0)
y = cv2.Sobel(gray_img,cv2.CV_16S,0,1)
absX = cv2.convertScaleAbs(x) # 转回uint8
absY = cv2.convertScaleAbs(y)
dst = cv2.addWeighted(absX,0.5,absY,0.5,0)
'''
cv2.imshow("absX", absX)
cv2.imshow("absY", absY)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
'''
在Sobel函数的第二个参数这里使用了cv2.CV_16S。因为OpenCV文档中对Sobel算子的介绍中有这么一句:“in the case of 8-bit input images it will result in truncated derivatives”。即Sobel函数求完导数后会有负值,还有会大于255的值。而原图像是uint8,即8位无符号数,所以Sobel建立的图像位数不够,会有截断。因此要使用16位有符号的数据类型,即cv2.CV_16S。
在经过处理后,别忘了用convertScaleAbs()函数将其转回原来的uint8形式。否则将无法显示图像,而只是一副灰色的窗口。convertScaleAbs()的原型为:
dst = cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])
其中可选参数alpha是伸缩系数,beta是加到结果上的一个值。结果返回uint8类型的图片。
由于Sobel算子是在两个方向计算的,最后还需要用cv2.addWeighted(...)函数将其组合起来。
4.图像直方图均衡化
这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。
hist = cv2.equalizeHist(gray_img)
5.傅里叶变换
- 前面提到的几种算法称为空间域滤波器
- 而傅里叶变换与小波变换为频率域滤波器
- [参考](https://baijiahao.baidu.com/s?id=1569965304720229&wfr=spider&for=pc&isFailFlag=1
')
6.图像输出
fig,axes=plt.subplots(2,3,figsize=(30,19))
axes[0,0].imshow(cv2.merge((r,g,b)));axes[0][0].set_title('Original picture')
axes[0,1].imshow(clahe_imge);axes[0,1].set_title('Clahe')
axes[0,2].imshow(gause_blur_img);axes[0,2].set_title('Gaussian_blur')
axes[1,0].imshow(absX);axes[1,0].set_title('X_scall Sobel')
axes[1,1].imshow(absY);axes[1,1].set_title('Y_scall Sobel')
axes[1,2].imshow(dst);axes[1,2].set_title('Add_weight Sobel Matrix')
plt.show()