OpenCV-Python 图像直方图

127 阅读4分钟
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
# 设置兼容中文
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
D:\Anaconda\AZWZ\lib\site-packages\numpy\_distributor_init.py:30: UserWarning: loaded more than 1 DLL from .libs:
D:\Anaconda\AZWZ\lib\site-packages\numpy\.libs\libopenblas.NOIJJG62EMASZI6NYURL6JBKM4EVBGM7.gfortran-win_amd64.dll
D:\Anaconda\AZWZ\lib\site-packages\numpy\.libs\libopenblas.WCDJNK7YVMPZQ2ME2ZZHJJRJ3JIKNDB7.gfortran-win_amd64.dll
  warnings.warn("loaded more than 1 DLL from .libs:\n%s" %

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eAW9try4-1637754593304)(attachment:image.png)]

cat = cv.imread('img/cat.jpeg',0)
plt.imshow(cat,cmap=plt.cm.gray)
<matplotlib.image.AxesImage at 0x21b695f0a60>




[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2ymFk7Rs-1637754593306)(output_3_1.png)]

1.直方图

hist = cv.calcHist([cat],[0],None,[256],[0,256])
hist
array([[  298.],
       [  235.],
       [  379.],
       [  484.],
       [  611.],
       [  541.],
       [  521.],
       [  569.],
       [  643.],
       [  593.],
       [  587.],
       [  583.],
       [  589.],
       [  608.],
       [  653.],
       [  723.],
       [  739.],
       [  745.],
       [  780.],
       [  767.],
       [  820.],
       [  878.],
       [  831.],
       [  887.],
       [  945.],
       [  945.],
       [  994.],
       [  998.],
       [ 1071.],
       [ 1085.],
       [ 1070.],
       [ 1180.],
       [ 1163.],
       [ 1276.],
       [ 1239.],
       [ 1314.],
       [ 1368.],
       [ 1329.],
       [ 1427.],
       [ 1474.],
       [ 1392.],
       [ 1436.],
       [ 1473.],
       [ 1523.],
       [ 1482.],
       [ 1516.],
       [ 1483.],
       [ 1594.],
       [ 1629.],
       [ 1537.],
       [ 1533.],
       [ 1628.],
       [ 1603.],
       [ 1613.],
       [ 1569.],
       [ 1684.],
       [ 1737.],
       [ 1752.],
       [ 1816.],
       [ 1864.],
       [ 1818.],
       [ 1956.],
       [ 2005.],
       [ 2138.],
       [ 2207.],
       [ 2323.],
       [ 2284.],
       [ 2362.],
       [ 2568.],
       [ 2578.],
       [ 2629.],
       [ 2670.],
       [ 2765.],
       [ 2662.],
       [ 2671.],
       [ 2596.],
       [ 2628.],
       [ 2661.],
       [ 2686.],
       [ 2694.],
       [ 2654.],
       [ 2520.],
       [ 2595.],
       [ 2755.],
       [ 2732.],
       [ 2807.],
       [ 2698.],
       [ 2696.],
       [ 2736.],
       [ 2755.],
       [ 2800.],
       [ 2746.],
       [ 2908.],
       [ 2929.],
       [ 3000.],
       [ 3147.],
       [ 3285.],
       [ 3312.],
       [ 3406.],
       [ 3522.],
       [ 3741.],
       [ 3952.],
       [ 4256.],
       [ 5150.],
       [ 6437.],
       [ 6974.],
       [ 8969.],
       [ 7342.],
       [ 8121.],
       [ 8383.],
       [ 9304.],
       [ 8677.],
       [ 8311.],
       [ 8104.],
       [ 7843.],
       [ 8341.],
       [ 7319.],
       [ 6924.],
       [ 6066.],
       [ 6012.],
       [ 5867.],
       [ 5655.],
       [ 5062.],
       [ 4995.],
       [ 4880.],
       [ 4907.],
       [ 4910.],
       [ 4974.],
       [ 5113.],
       [ 4994.],
       [ 5158.],
       [ 5132.],
       [ 5358.],
       [ 5783.],
       [ 5855.],
       [ 6271.],
       [ 7423.],
       [ 8547.],
       [10928.],
       [12840.],
       [10364.],
       [ 6580.],
       [ 5052.],
       [ 4022.],
       [ 3587.],
       [ 3641.],
       [ 3547.],
       [ 3517.],
       [ 3372.],
       [ 3278.],
       [ 3217.],
       [ 3202.],
       [ 3183.],
       [ 3047.],
       [ 3012.],
       [ 2868.],
       [ 2933.],
       [ 2839.],
       [ 2776.],
       [ 2842.],
       [ 2654.],
       [ 2586.],
       [ 2538.],
       [ 2398.],
       [ 2506.],
       [ 2403.],
       [ 2315.],
       [ 2265.],
       [ 2144.],
       [ 2189.],
       [ 2239.],
       [ 2192.],
       [ 2150.],
       [ 2240.],
       [ 2564.],
       [ 2564.],
       [ 2677.],
       [ 2436.],
       [ 2766.],
       [ 3023.],
       [ 2942.],
       [ 2927.],
       [ 2796.],
       [ 2804.],
       [ 2841.],
       [ 2870.],
       [ 2796.],
       [ 2721.],
       [ 2691.],
       [ 2624.],
       [ 2511.],
       [ 2547.],
       [ 2513.],
       [ 2581.],
       [ 2471.],
       [ 2402.],
       [ 2359.],
       [ 2456.],
       [ 2317.],
       [ 2304.],
       [ 2363.],
       [ 2089.],
       [ 2142.],
       [ 2042.],
       [ 2040.],
       [ 2015.],
       [ 1755.],
       [ 1816.],
       [ 1871.],
       [ 1790.],
       [ 1717.],
       [ 1757.],
       [ 1734.],
       [ 1958.],
       [ 2019.],
       [ 1960.],
       [ 2063.],
       [ 1917.],
       [ 1921.],
       [ 1846.],
       [ 1827.],
       [ 1583.],
       [ 1459.],
       [ 1362.],
       [ 1292.],
       [ 1325.],
       [ 1276.],
       [ 1161.],
       [ 1118.],
       [  999.],
       [  973.],
       [  896.],
       [  917.],
       [  871.],
       [  819.],
       [  944.],
       [  930.],
       [  941.],
       [  986.],
       [ 1114.],
       [ 1140.],
       [ 1199.],
       [ 1098.],
       [ 1040.],
       [ 1147.],
       [ 1293.],
       [ 1347.],
       [ 1659.],
       [ 1366.],
       [ 1370.],
       [ 1007.],
       [  849.],
       [  765.],
       [  908.],
       [ 1769.],
       [ 3014.]], dtype=float32)
plt.plot(hist)
[<matplotlib.lines.Line2D at 0x21b6a817040>]




[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5A8BJOVM-1637754593308)(output_6_1.png)]

2.掩膜的应用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cWoCibje-1637754593310)(attachment:image.png)]

# 创建掩膜对象
mask = np.zeros(cat.shape[:2],np.uint8)
# 指定感兴趣区域
mask[400:650,200:500] = 1
# 蒙版可视化(白色区域即为感兴趣区域)
plt.imshow(mask,cmap=plt.cm.gray)
<matplotlib.image.AxesImage at 0x21b6a84f0d0>




[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3S4pANBM-1637754593312)(output_10_1.png)]

mask_cat = cv.bitwise_and(cat,cat,mask=mask)
plt.imshow(mask_cat,cmap=plt.cm.gray)
<matplotlib.image.AxesImage at 0x21b695816a0>




[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dG5sNMNx-1637754593312)(output_11_1.png)]

mask_hist = cv.calcHist([cat],[0],mask,[256],[0,256])
plt.plot(mask_hist)
[<matplotlib.lines.Line2D at 0x21b6a45fa60>]




[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NzZSxHll-1637754593313)(output_13_1.png)]

3.直方图均衡化(提高对比度)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Q2UewYq-1637754593314)(attachment:image.png)]

# 对cat图像进行直方图均衡化
dst = cv.equalizeHist(cat)
plt.figure(figsize=(20,20))
plt.subplot(1,2,1)
m1 = plt.imshow(cat,cmap=plt.cm.gray)
plt.title("原图")
plt.subplot(1,2,2)
m2 = plt.imshow(dst,cmap=plt.cm.gray)
plt.title("直方图均衡化后")
Text(0.5, 1.0, '直方图均衡化后')




[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vkJiG6Rc-1637754593314)(output_17_1.png)]

4.自适应均衡化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sclq734M-1637754593315)(attachment:image.png)]

#  cv.createCLAHE(对比度限制,每一个小块的大小)
cl = cv.createCLAHE(2.0,(8,8))
# 自适应均衡化
res = cl.apply(cat)
plt.figure(figsize=(20,20))
plt.subplot(1,2,1)
m1 = plt.imshow(cat,cmap=plt.cm.gray)
plt.title("原图")
plt.subplot(1,2,2)
m2 = plt.imshow(res,cmap=plt.cm.gray)
plt.title("自适应均衡化后")
Text(0.5, 1.0, '自适应均衡化后')




[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dXFu4fz3-1637754593316)(output_22_1.png)]

总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h7WceFS2-1637754593317)(attachment:image.png)]