如何用R将RGB分量矩阵转换为直方图均衡化后的矩阵?
解决直方图均衡化后还原为原维度矩阵的问题
我明白你现在的困扰——你已经用histeq算出了均衡化后的数值,但得到的是一维数组,没法直接对应回原来的RGB矩阵结构。别担心,咱们只需要把这个一维结果重新“塑形”成和原矩阵一模一样的维度就可以了,步骤很简单:
第一步:保留原矩阵的维度信息
首先,你得先记下原RGB矩阵r、g、b的行数和列数,这样后面才能准确还原矩阵结构:
# 保存原矩阵的维度(假设你的原矩阵是r, g, b) dim_r <- dim(r) dim_g <- dim(g) dim_b <- dim(b)
第二步:用histeq处理并还原矩阵
histeq函数处理一维向量后会返回均衡化的一维结果,咱们把原矩阵先转成一维向量处理,再用matrix()函数把结果重新排列成原矩阵的形状:
# 处理R通道:先转一维向量,均衡化,再还原矩阵 r_eq_vector <- histeq(as.vector(r))$eq # 注意:如果你的histeq直接返回向量,去掉$eq即可 r_eq_matrix <- matrix(r_eq_vector, nrow = dim_r[1], ncol = dim_r[2]) # 处理G通道 g_eq_vector <- histeq(as.vector(g))$eq g_eq_matrix <- matrix(g_eq_vector, nrow = dim_g[1], ncol = dim_g[2]) # 处理B通道 b_eq_vector <- histeq(as.vector(b))$eq b_eq_matrix <- matrix(b_eq_vector, nrow = dim_b[1], ncol = dim_b[2])
这里要注意:不同包的histeq返回格式可能不一样——比如EBImage包的histeq会返回一个包含eq(均衡化后的值)的列表,如果你用的是其他实现,可能直接返回一维向量,这时候去掉$eq就行。
第三步:更新你的绘图代码
原来的绘图代码里用的是r1$Values,现在可以直接用均衡化后的矩阵元素来绘图,这样更准确:
# R通道均衡化后的直方图 hr3 <- ggplot(data = data.frame(Values = as.vector(r_eq_matrix)), aes(Values)) + geom_histogram(breaks = seq(0, 260, by = 20), col = "white", aes(fill = ..count..)) + scale_fill_gradient("Count", low = "lightpink", high = "red") + labs(title = "Ιστόγραμμα Εξίσωσης Κόκκινου Καναλιού", x = "Νέες Τιμές") # G通道和B通道同理修改hg3、hb3即可
补充说明
你之前手动计算频率和累积分布的代码是作业第一部分的要求,这部分没问题——histeq其实就是帮你自动完成了类似的映射计算,咱们现在做的只是把它的一维输出还原成矩阵结构,这样就能得到和原RGB矩阵一一对应的均衡化后数值了。
内容的提问来源于stack exchange,提问作者Αναστασιος Κούσας
相关产品推荐
相关产品推荐

