Python+OpenCV图像处理(第9课---直方图)

一张图像对应的直方图,横坐标是灰度级(比如8位图像,灰度级是0~255),纵坐标表示该灰度级的像素点个数(归一化直方图的话,对应的是该灰度级像素点的频率)。

matplotlib.pyplot绘制直方图

# -*- coding: utf-8 -*-

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("C:\\imgs\\lena256.bmp", flags = cv2.IMREAD_UNCHANGED)

cv2.imshow("original", img)
# hist绘制直方图,gray.ravel()多维数组转成一维数组,256代表灰度级[0, 255]
plt.hist(img.ravel(), 256)

cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

opencv绘制直方图

matplotlib.pyplot绘图示例

# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt

# 参数,左闭右开区间,0.1是步长
x = np.arange(-3, 3, 0.1)
y = np.sin(x)

plt.plot(x, y)

在这里插入图片描述

# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt

# 参数,左闭右开区间,0.1是步长
x = [1, 2, 3, 4, 5, 6]
y = [3, 1, 7, 2, 10, 12]

plt.plot(x, y, color='red')

在这里插入图片描述

# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt

y = [3, 1, 7, 2, 10, 12]

# 只有y一个参数也可以,观察横坐标从0开始,rgb,每个选项可以填0/1
plt.plot(y, color=[1,0,0])

在这里插入图片描述

calcHist():统计图像直方图对应的那个数组,然后用plt画图。

# -*- coding: utf-8 -*-

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("C:\\imgs\\lenacolor.png", flags = cv2.IMREAD_UNCHANGED)


# 参数:图像数组,通道数组,掩码(取图像部分),灰度级数组,灰度级范围数组
histb = cv2.calcHist([img], [0], None, [256], [0, 255])
histg = cv2.calcHist([img], [1], None, [256], [0, 255])
histr = cv2.calcHist([img], [2], None, [256], [0, 255])

# 绘制使用plot(先用calcHist统计某通道上的一维数组)
plt.plot(histb, color='b')
plt.plot(histg, color='g')
plt.plot(histr, color='r')

在这里插入图片描述

使用掩码的直方图

下图中掩码可以取图像的某一部分绘制直方图(掩码对应的白色区域)。
在这里插入图片描述

# -*- coding: utf-8 -*-

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("c:\\imgs\\lena256.bmp", flags=cv2.IMREAD_UNCHANGED)
mask = np.zeros(img.shape, np.uint8)
mask[100:200, 100:200] = 255
# 没使用掩码,整幅图像绘制直方图
hist1 = cv2.calcHist([img], [0], None, [256], [0, 255])
# 使用掩码,取图像的一部分绘制直方图
hist2 = cv2.calcHist([img], [0], mask, [256], [0, 255])
plt.plot(hist1)
plt.plot(hist2)

在这里插入图片描述

掩码原理及演示

原始图像和掩码图像进行位与运算,就可以了。

# -*- coding: utf-8 -*-

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("c:\\imgs\\lena256.bmp", flags=cv2.IMREAD_GRAYSCALE)
mask = np.zeros(img.shape, np.uint8)
mask[100:200, 100:200] = 255
maskimg = cv2.bitwise_and(img, mask)
cv2.imshow("img", img)
cv2.imshow("mask", mask)
cv2.imshow("maskimg", maskimg)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

扫描二维码关注公众号,回复: 10830440 查看本文章

直方图均衡化

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

第1种处理方式

在这里插入图片描述
在这里插入图片描述

第2种处理方式

在这里插入图片描述
在这里插入图片描述

直方图均衡化函数equalizeHist

# -*- coding: utf-8 -*-

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("c:\\imgs\\equ.bmp", flags=cv2.IMREAD_GRAYSCALE)
res = cv2.equalizeHist(img)

cv2.imshow("img", img)
cv2.imshow("res", res)

plt.hist(img.ravel(), 256)
plt.figure()
plt.hist(res.ravel(), 256)

cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

subplot函数

多幅直方图显示在一起。

# -*- coding: utf-8 -*-

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("c:\\imgs\\equ.bmp", flags=cv2.IMREAD_GRAYSCALE)
res = cv2.equalizeHist(img)
# 1行2列的窗口,绘制第1个
plt.subplot(1, 2, 1)
plt.hist(img.ravel(), 256)
# 1行2列的窗口,绘制第2个
plt.subplot(1, 2, 2)
plt.hist(res.ravel(), 256)


在这里插入图片描述

matplotlib.pyplot.imshow(x, cmap=None)

x:要绘制的图像
cmap:colormap,默认是RGB类型。灰度图对应的是plt.cm.gray。opencv读入的是BGR类型,要转成RGB类型。

# -*- coding: utf-8 -*-

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("c:\\imgs\\lenacolor.png", flags=cv2.IMREAD_UNCHANGED)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# BGR图像,cmap默认类型RGB ---(错误)
plt.subplot(1, 5, 1)
plt.imshow(img)
plt.axis('off')     # 不显示坐标轴

# BGR图像,cmap指定类型gray ---(错误)
plt.subplot(1, 5, 2)
plt.imshow(img, cmap=plt.cm.gray)
plt.axis('off')

# 灰度图像,cmap默认类型RGB ---(错误)
plt.subplot(1, 5, 3)
plt.imshow(gray)
plt.axis('off')

# 灰度图像,cmap指定类型gray ---(正确)
plt.subplot(1, 5, 4)
plt.imshow(gray, plt.cm.gray)
plt.axis('off')

# BGR图像转成RGB图像显示 ---(正确)
b, g, r = cv2.split(img)
img2 = cv2.merge([r, g, b])
plt.subplot(1, 5, 5)
plt.imshow(img2)
plt.axis('off')

在这里插入图片描述

更多示例代码

# -*- coding: utf-8 -*-

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("c:\\imgs\\equ.bmp", flags=cv2.IMREAD_GRAYSCALE)

eimg = cv2.equalizeHist(img)

plt.subplot(2, 2, 1)
plt.imshow(img, cmap=plt.cm.gray)
plt.axis('off')     # 不显示坐标轴

plt.subplot(2, 2, 2)
plt.imshow(eimg, cmap=plt.cm.gray)
plt.axis('off')

plt.subplot(2, 2, 3)
plt.hist(img.ravel(), 256)

plt.subplot(2, 2, 4)
plt.hist(eimg.ravel(), 256)

在这里插入图片描述

特别说明

本文参考网易云课堂《Python+OpenCV图像处理》

发布了323 篇原创文章 · 获赞 193 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/ccnuacmhdu/article/details/103843567