图像运算和图像增强五

图像运算和图像增强五

图像掩膜直方图和 HS 直方图

(1)图像掩膜直方图
如果要统计图像的某一部分直方图,就需要使用掩码(蒙板)来进行计算。假设将要统计的部分设置为白色,其余部分设置为黑色,然后使用该掩膜进行直方图绘制。

import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
img=cv2.imread('luo.png')
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,mask=mask)
#图像直方图计算
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.xlable('x'),plt.ylable('y')
plt.show()S

在这里插入图片描述
(2)图像HS直方图(色调-饱和度直方图)

为了刻画图像中颜色的直观特性,常常需要分析图像的 HSV 空间下的直方图特性。HSV 空间是由色调(Hue)、饱和度(Saturation)、以及亮度(Value)构成,因此在进行直方图计算时,需要先将源 RGB 图像转化为 HSV 颜色空间图像,然后将对应的 H 和 S 通道进行单元划分,再其二维空间上计算相对应直方图,再计算直方图空间上的最大值并归一化绘制相应的直方图信息。

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, interpolation='nearest'), 
plt.title("(b)")
plt.xlabel("x"), plt.ylabel("y")
plt.show()

其中 X 轴表示饱和度(S),Y 轴表示色调(H)。可以看到 H=140
和 S=130 附近的一些高值,它对应于艳丽的色调。

在这里插入图片描述
(3)直方图判断白天黑夜
1.方法一:图像平均值、灰度中值和灰度标准差计算
常见的方法是通过计算图像的灰度平均值、灰度中值或灰度标准差,再与自定义的阈值进行对比,从而判断是黑夜还是白天。

import cv2
import numpy as np
import matplotlib.pyplot as plt
#函数:获取图像的灰度平均值
def fun_mean(img,height,width):
	sum_img=0
	for 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//2
		y=data[z]
	else:
		y=(int(data[length/2])+int(data[length//2-1]))/2
	return y
#读取图像
img=cv2.imread('lena-hd.png')
#图像灰度转换
grayimage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

height=grayimag.shape[0]
width=grayimage.shape[1]

mean=fun_mean(grayimage,height,width)
print('灰度平均值:',mean)

value=grayimage.ravel(0 #获取所有像素值
median=fun_median(value)
print('灰度中值:', median)

#计算图像的灰度标准差
std=np.std(value,ddof=1)
print('灰度标准差:',std)

在这里插入图片描述
2.方法二:使用阈值进行比较,基本步骤如下:
(1)读取原始图像,转换为灰度图,并获取图像的所有像素值;
(2)设置灰度阈值并计算该阈值以下的像素个数。比如像素的阈值设置为50,统计低于 50 的像素值个数;
(3)设置比例参数,对比该参数与低于该阈值的像素占比,如果低于参数则预测为白天,高于参数则预测为黑夜。比如该参数设置为 0.8,像素的灰度值低于阈值 50 的个数占整幅图像所有像素个数的 90%,则认为该图像偏暗,故322预测为黑夜;否则预测为白天。

import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
#函数:判断黑夜或白天
def func_judge(img):
	height=grayimg.shape[0]
	width=grayimg.shape[1]
	piexs_sum=height*width
	dark_sum=0 #偏暗像素个数
	dark_prop=0 #偏暗像素所占比例
	for i in range(height):
		for j in range(width):
			if img[i,j]<50:
				dark_sum+=1
			print(dark_sum)
			print(piexs_sum)
			dark_prop=dark_sum*1.0/peixs_sum
			if dark_prop>=0.8:
				print('This picture is dark!',dark_prop)
			else :
				print('This picture is bright! ',dark_prop)

img=cv2.imread('test.jpg')
img_rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
grayimg=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, color='r'), plt.xlabel("x"), plt.ylabel("y"), plt.title("(b)")
plt.show()

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值