做网站注意什么问题,网站建设条款,微信官方网站开发,平面广告设计作品集一.图像掩膜直方图
如果要统计图像的某一部分直方图#xff0c;就需要使用掩码#xff08;蒙板#xff09;来进行计算。假设将要统计的部分设置为白色#xff0c;其余部分设置为黑色#xff0c;然后使用该掩膜进行直方图绘制#xff0c;其完整代码如下所示。 # -*- codi…一.图像掩膜直方图
如果要统计图像的某一部分直方图就需要使用掩码蒙板来进行计算。假设将要统计的部分设置为白色其余部分设置为黑色然后使用该掩膜进行直方图绘制其完整代码如下所示。 # -*- coding: utf-8 -*-
# ByEastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
#读取图像
img cv2.imread(luo.png)
#转换为RGB图像
img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#设置掩膜
mask np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:300] 255
masked_img cv2.bitwise_and(img, img, maskmask)
#图像直方图计算
hist_full cv2.calcHist([img], [0], None, [256], [0,256]) #通道[0]-灰度图
#图像直方图计算(含掩膜)
hist_mask cv2.calcHist([img], [0], mask, [256], [0,256])
plt.figure(figsize(8, 6))
#设置字体
matplotlib.rcParams[font.sans-serif][SimHei]
#原始图像
plt.subplot(221)
plt.imshow(img_rgb, gray)
plt.axis(off)
plt.title((a)原始图像)
#绘制掩膜
plt.subplot(222)
plt.imshow(mask, gray)
plt.axis(off)
plt.title((b)掩膜)
#绘制掩膜设置后的图像
plt.subplot(223)
plt.imshow(masked_img, gray)
plt.axis(off)
plt.title((c)图像掩膜处理)
#绘制直方图
plt.subplot(224)
plt.plot(hist_full)
plt.plot(hist_mask)
plt.title((d)直方图曲线)
plt.xlabel(x)
plt.ylabel(y)
plt.show() 其运行结果如图1所示它使用了一个200×200像素的掩膜进行实验。其中图1(a)表示原始图像图1(b)表示200×200像素的掩膜图1©表示原始图像进行掩膜处理图1(d)表示直方图曲线蓝色曲线为原始图像的灰度值直方图分布情况绿色波动更小的曲线为掩膜直方图曲线。 二.图像HS直方图
为了刻画图像中颜色的直观特性常常需要分析图像的HSV空间下的直方图特性。HSV空间是由色调Hue、饱和度Saturation、以及亮度Value构成因此在进行直方图计算时需要先将源RGB图像转化为HSV颜色空间图像然后将对应的H和S通道进行单元划分再其二维空间上计算相对应直方图再计算直方图空间上的最大值并归一化绘制相应的直方图信息从而形成色调-饱和度直方图或H-S直方图。该直方图通常应用在目标检测、特征分析以及目标特征跟踪等场景[1-2]。
由于H和S分量与人感受颜色的方式是紧密相连V分量与图像的彩色信息无关这些特点使得HSV模型非常适合于借助人的视觉系统来感知彩色特性的图像处理算法。
下面的代码是具体的实现代码使用matplotlib.pyplot库中的imshow()函数来绘制具有不同颜色映射的2D直方图。 # -*- coding: utf-8 -*-
# ByEastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图像
img cv2.imread(luo.png)
#转换为RGB图像
img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#图像HSV转换
hsv cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#计算H-S直方图
hist cv2.calcHist(hsv, [0,1], None, [180,256], [0,180,0,256])
#原始图像
plt.figure(figsize(8, 6))
plt.subplot(121), plt.imshow(img_rgb, gray), plt.title((a)), plt.axis(off)
#绘制H-S直方图
plt.subplot(122), plt.imshow(hist, interpolationnearest), plt.title((b))
plt.xlabel(x), plt.ylabel(y)
plt.show() 图2(a)表示原始输入图像图2(b)是原图像对应的彩色直方图其中X轴表示饱和度SY轴表示色调H。在直方图中可以看到H140和S130附近的一些高值它对应于艳丽的色调。 三.直方图判断白天黑夜
接着讲述一个应用直方图的案例通过直方图来判断一幅图像是黑夜或白天。常见的方法是通过计算图像的灰度平均值、灰度中值或灰度标准差再与自定义的阈值进行对比从而判断是黑夜还是白天[3-4]。
灰度平均值该值等于图像中所有像素灰度值之和除以图像的像素个数。灰度中值对图像中所有像素灰度值进行排序然后获取所有像素最中间的值即为灰度中值。灰度标准差又常称均方差是离均差平方的算术平均数的平方根。标准差能反映一个数据集的离散程度是总体各单位标准值与其平均数离差平方的算术平均数的平方根。如果一幅图看起来灰蒙蒙的 那灰度标准差就小如果一幅图看起来很鲜艳那对比度就很大标准差也大。
下面的代码是计算灰度“Lena”图的灰度平均值、灰度中值和灰度标准差。 # -*- coding: utf-8 -*-
# ByEastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#函数: 获取图像的灰度平均值
def fun_mean(img, height, width):sum_img 0for i in range(height):for j in range(width):sum_img sum_img int(img[i,j])mean sum_img / (height * width)return mean
#函数: 获取中位数
def fun_median(data):length len(data)data.sort()if (length % 2) 1: z length // 2y data[z]else:y (int(data[length//2]) int(data[length//2-1])) / 2return y
#读取图像
img cv2.imread(lena-hd.png)
#图像灰度转换
grayImage cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height grayImage.shape[0]
width grayImage.shape[1]
#计算图像的灰度平均值
mean fun_mean(grayImage, height, width)
print(灰度平均值, mean)
#计算图像的灰度中位数
value grayImage.ravel() #获取所有像素值
median fun_median(value)
print(灰度中值, median)
#计算图像的灰度标准差
std np.std(value, ddof 1)
print(灰度标准差, std) 其运行结果如图3所示图3(a)为原始图像图3(b)为处理结果。其灰度平均值为123灰度中值为129灰度标准差为48.39。 下面讲解另一种用来判断图像是白天还是黑夜的方法其基本步骤如下
1读取原始图像转换为灰度图并获取图像的所有像素值2设置灰度阈值并计算该阈值以下的像素个数。比如像素的阈值设置为50统计低于50的像素值个数3设置比例参数对比该参数与低于该阈值的像素占比如果低于参数则预测为白天高于参数则预测为黑夜。比如该参数设置为0.8像素的灰度值低于阈值50的个数占整幅图像所有像素个数的90%则认为该图像偏暗故预测为黑夜否则预测为白天。
具体实现的代码如下所示。 # -*- coding: utf-8 -*-
# ByEastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#函数: 判断黑夜或白天
def func_judge(img):#获取图像高度和宽度height grayImage.shape[0]width grayImage.shape[1]piexs_sum height * widthdark_sum 0 #偏暗像素个数dark_prop 0 #偏暗像素所占比例for i in range(height):for j in range(width):if img[i, j] 50: #阈值为50dark_sum 1#计算比例print(dark_sum)print(piexs_sum)dark_prop dark_sum * 1.0 / piexs_sum if dark_prop 0.8:print(This picture is dark!, dark_prop)else:print(This picture is bright!, dark_prop)
#读取图像
img cv2.imread(day.png)
#转换为RGB图像
img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#图像灰度转换
grayImage cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#计算256灰度级的图像直方图
hist cv2.calcHist([grayImage], [0], None, [256], [0,255])
#判断黑夜或白天
func_judge(grayImage)
#显示原始图像和绘制的直方图
plt.subplot(121), plt.imshow(img_rgb, gray), plt.axis(off), plt.title((a))
plt.subplot(122), plt.plot(hist, colorr), plt.xlabel(x), plt.ylabel(y), plt.title((b))
plt.show() 第一张测试图输出的结果如图4所示其中图4(a)为原始图像图4(b)为对应直方图曲线。 最终输出结果为“(‘This picture is bright!’, 0.010082704388303882)”该预测为白天。 第二张测试图输出的结果如图6所示其中图6(a)为原始图像图6(b)为对应直方图曲线。 最终输出结果为“(‘This picture is dark!’, 0.8511824175824175)”该预测为黑夜。 四.总结
本章主要讲解图像直方图相关知识点包括掩膜直方图和HS直方图并通过直方图判断黑夜与白天通过案例分享直方图的实际应用。希望对您有所帮助后续将进入图像增强相关知识点