什么是直方图呢?通过直方图你可以对整幅图像的灰度分布有一个整体的感觉了解。直方图的 x 轴是灰度值(0 到 255),y轴是图片中具有同一个灰度值的 点的数目。可以通过下面的图像感受一下

图像处理算法如何入门(从零学AI之图像算法10)(1)

直方图是处理当中非常常用的一种手段,opencv也有现成的方法,cv2.calcHist

用法:cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

def show_hist(cv2_img): """ 显示直方图 """ color = ('b','g','r') for i,col in enumerate(color): histr = cv2.calcHist([cv2_img],[i],None,[256],[0,256]) plt.plot(histr,color = col) plt.legend() plt.xlim([0,256]) plt.xticks([]), plt.yticks([]) plt.show()

通过直方图我们可以观察该直方图了解需要如何调整亮度分布。下面的图蓝色分量在200 ~ 250较高,应该就是天空的颜色,因为对应亮度最大。

图像处理算法如何入门(从零学AI之图像算法10)(2)

我们可以通过前几章分享的知识,对应主题进行分离,看看亮度在3维空间的分布情况。

首先,我们需要获得二值图像:

我们先用默认值进行二值图效果:

gray = cv2.cvtColor(cv2_img, cv2.COLOR_BGR2GRAY) blur = cv2.blur(gray, (10, 10)) k=np.ones((10, 10),np.uint8) _, th = cv2.threshold(blur, 127, 255, cv2.THRESH_OTSU)

原图:

图像处理算法如何入门(从零学AI之图像算法10)(3)

mask:

图像处理算法如何入门(从零学AI之图像算法10)(4)

通过逻辑运算获得图像:

图像处理算法如何入门(从零学AI之图像算法10)(5)

img = cv2.bitwise_and(cv2_img, cv2_img, mask=~open)

分离颜色通道, 获得像素值:

这里采用切片来处理:

img_b = cv2_img[:, :, 0].astype(np.int16)

img_g = cv2_img[:, :, 1].astype(np.int16)

img_r = cv2_img[:, :, 2].astype(np.int16)

三维空间显示

图像处理算法如何入门(从零学AI之图像算法10)(6)

图像处理算法如何入门(从零学AI之图像算法10)(7)

我们可以看到颜色较深的橙色部分就是主题。再来看一个例子:

图像处理算法如何入门(从零学AI之图像算法10)(8)

图像处理算法如何入门(从零学AI之图像算法10)(9)

图像处理算法如何入门(从零学AI之图像算法10)(10)

通过这几个例子,关于亮度的影响就很深刻了,这对我们后面使用灰度直方图有很大帮助。

### 显示3D图像 def showPiexlDist(imgArrs): fig = plt.figure() ax1 = fig.add_subplot(111, projection='3d') h, w, pimg = piexlDifvalue(imgArrs) x = np.arange(0, w, 1) y = np.arange(0, h, 1) X, Y = np.meshgrid(x, y) Z = np.zeros(Y.shape, dtype=np.uint16) for i in range(Y.shape[0]): for j in range(Y.shape[1]): Z[i][j] = img_sum[i][j] ax1.plot_surface(X, Y, Z, rstride=1, cstride=1,cmap=plt.get_cmap('rainbow')) plt.show()

好了,本次就分享到这里。欢迎大家评论、交流和转发。

,