"""对彩色图像进行直方图均衡"""
import math
import numpy as np
import cv2
import matplotlib
# 彩色图像进行自适应直方图均衡化,img为RGB格式的图像
def hisEqulColor(img):
# 将RGB图像转换到YCrCb空间中
ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB)
# 将YCrCb图像通道分离
channels = cv2.split(ycrcb)
# tilesGridSize:图像被分成称为“tiles”(瓷砖、地砖、小方地毯、片状材料、块状材料)的小块,在OpenCV中,tilesGridSize默认为8x8
# ,即整个图像被划分为8纵8横共64块。然后对每一个块进行直方图均衡处理
# clipLimit:裁剪限制,此值与对比度受限相对应,对比度限制这个参数是用每块的直方图的每个bins的数和整图的平均灰度分布数的比值来限制的。
# 裁剪则是将每块图像直方图中超过ClipLimit的bins多出的灰度像素数去除超出部分,然后将所有bins超出的像素数累加后平均分配到所有bins。
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
# apply方法用于对图像应用对比度受限自适应直方图均衡变换处理
clahe.apply(channels[0], channels[0])
# 将处理后的通道和没有处理的两个通道合并,命名为ycrcb
cv2.merge(channels, ycrcb)
# 将YCrCb图像转换回RGB图像
cv2.cvtColor(ycrcb, cv2.COLOR_YCR_CB2BGR, img)
return img
# 计算图像灰度直方图
def calcGrayHist(img):
# 灰度图像矩阵的宽高
rows, cols = img.shape
# 存储灰度直方图
grayHist = np.zeros([1, 256], np.uint32)
for r in range(rows):
for c in range(cols):
grayHist[0][img[r][c]] += 1
return grayHist
def ostu(img):
image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
rows, cols = image.shape
# 计算图像的灰度直方图
grayHist = calcGrayHist(image)
# 归一化灰度直方图
uniformGrayHist = grayHist / float(rows * cols)
# 计算零阶累积矩和一阶累积矩
zeroCumuMoment = np.zeros([1, 256], np.float32)
oneCumuMoment = np.zeros([1, 256], np.float32)
for k in range(256):
if k == 0:
zeroCumuMoment[0][k] = uniformGrayHist[0][0]
oneCumuMoment[0][k] = (k + 1) * uniformGrayHist[0][0]
else:
zeroCumuMoment[0][k] = zeroCumuMoment[0][k - 1] + uniformGrayHist[0][k]
oneCumuMoment[0][k] = oneCumuMoment[0][k - 1] + k * uniformGrayHist[0][k]
# 计算类间方差
variance = np.zeros([1, 256], np.float32)
for k in range(255):
if zeroCumuMoment[0][k] == 0:
variance[0][k] = 0
else:
variance[0][k] = math.pow(oneCumuMoment[0][255] * zeroCumuMoment[0][k] - oneCumuMoment[0][k], 2) / (
zeroCumuMoment[0][k] * (1.0 - zeroCumuMoment[0][k]))
# 找到阈值
threshLoc = np.where(variance[0][0:255] == np.max(variance[0][0:255]))
thresh = threshLoc[0]
# 返回阈值
return thresh
def preprocess(image, pos):
# 输入图像由RGB格式转为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 进行高斯模糊,高斯核大小为(11, 11)
blurred = cv2.GaussianBlur(gray, (11, 11), 0)
# 进行阈值处理,最小阈值为ostu算法得到的起始阈值,最大值为255,选用cv2.THRESH_BINARY进行处理,当像素值大于起始阈值时像素值修改为255,否则为0
thresh = cv2.threshold(blurred, pos[0], 255, cv2.THRESH_BINARY)[1]
# 执行一系列侵蚀和扩张,以从阈值图像中去除任何小的噪声斑点
kernel = np.array([[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0]], dtype='uint8')
thresh = cv2.erode(thresh, kernel, iterations=6) # 腐蚀迭代了6次
thresh = cv2.dilate(thresh, kernel, iterations=8) # 膨胀迭代了8次
# 创建掩膜mask,大小和图像一致,初始值为0
mask = np.zeros(thresh.shape, dtype="uint8")
# 计算掩膜中各个区域的纵横比rate_1,筛选掉纵横比大于R_1=1.6或小于R_2=0.6的区域
contours, hierarchy = cv2.findContours(
thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
labelMask = np.zeros(thresh.shape, dtype="uint8")
labelMask = cv2.drawContours(labelMask, [cnt], 0, 255, -1)
numPixels = cv2.countNonZero(labelMask)
if numPixels < 200:
continue
_, _, w, h = cv2.boundingRect(labelMask)
aspect_ratio = float(w) / h
if aspect_ratio > 1.6 or aspect_ratio < 0.7:
continue
mask = cv2.add(mask, labelMask)
# 保存高亮部分mask
cv2.imwrite("highlight.png", mask)
# 将高亮部分像素值缩小10
B = image[:, :, 0]
G = image[:, :, 1]
R = image[:, :, 2]
h, w = mask.shape
for i in range(h):
for j in range(w):
if mask[i][j] != 0:
B[i][j] -= 10 * 0.114
G[i][j] -= 10 * 0.587
R[i][j] -= 10 * 0.299
src_new = np.zeros(image.shape).astype("uint8")
src_new[:, :, 0] = B
src_new[:, :, 1] = G
src_new[:, :, 2] = R
# 返回高亮处理后的结果
return src_new
if __name__ == "__main__":
# 载入图像
image = cv2.imread('in.png')
# 阈值算法
ostu_thresh = ostu(image)
# 高亮区域
res = preprocess(image, ostu_thresh)
# 阈值处理的结果
res = hisEqulColor(res)
# 保存阈值处理的结果
cv2.imwrite('Histogram_Equalization.png', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
猰貐的新时代
- 粉丝: 1w+
- 资源: 3014
最新资源
- 基于协同过滤算法的东北特产销售系统的实现--论文pf-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于SpringBoot的私房菜定制上门服务系统的设计与实现pf-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于协同过滤算法的私人诊所管理系统_6t4o8--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于springboot的实习管理系统-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于协同过滤算法的体育商品推荐系统_t81xg--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于协同过滤算法的黔醉酒业白酒销售系统_p091v--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于springboot的网购平台管理系统_0q1i3--论文-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于疫情防控管理系统的数据可视化分析与实现_3mkgh-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于SpringBoot的网络海鲜市场系统的设计与实现-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 基于springboot的乡村政务办公系统的设计与实现-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于协同过滤算法商品推荐系统pf-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于SpringBoot的小学生身体素质测评管理系统设计与实现-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.rar
- 基于Springboot的小区疫情购物系统录pf-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 抽水蓄能电站的最佳调度方案研究 参考文献:抽水蓄能电站的最佳调度方案研究 非完全复献 matlab?粒子群算法 主要内容:研究抽水蓄能机组调峰填谷的功能,目标是从电网的利益出发,结合抽水蓄能电站的运行
- 基于springboot的校园失物招领系统--论文pf-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
- 基于SpringBoot的学生网上选课系统--论文pf-springboot毕业项目,适合计算机毕-设、实训项目、大作业学习.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈