目录
图像直方图
函数及参数
代码实现
运行结果
直方图均衡化
函数及参数
代码实现
运行结果
图像卷积
我的理解
卷积的边缘填充函数
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.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()
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 计算生成 sigmaXksize与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()