0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么不能直接对RGB图做直方图均衡化

FPGA开源工坊 来源:FPGA开源工坊 2024-01-02 09:41 次阅读

相信好多人在开始学习FPGA图像处理的时候都是接触的RGB转灰度图,Sobel图像检测,直方图均衡化这样的算法

然后在做直方图均衡化的时候也是要先RGB转灰度,然后再对灰度图进行直方图均衡化,网上的课程也大多数都是这样做的,不知道大家会不会产生一个疑问就不能直接对RGB图做直方图均衡化吗?

首先说答案是不可以的。

我们来看看为什么。

先来看一段简单的代码:

img = cv2.imread(r'E:python_image_simpythonProjectsimimgimg.png')


equ=cv2.equalizeHist(img)


cv2.imshow('bgr', img)
cv2.waitKey()
cv2.destroyAllWindows()

读取一张图片,然后对其做直方图均衡化,很简单,但是OpenCV报错了。

edd2b562-a703-11ee-8b88-92fbcf53809c.png

报错说直方图均衡化这个函数的参数应该是CV_8UC1,那么我们将RGB通道给分离出来分别进行直方图均衡化不就好了吗,说干就干。

img = cv2.imread(r'E:python_image_simpythonProjectsimimgimg.png')


b, g, r = cv2.split(img)
equ_b = cv2.equalizeHist(b)
equ_g = cv2.equalizeHist(g)
equ_r = cv2.equalizeHist(r)
equ = cv2.merge([equ_b, equ_g, equ_r])
cv2.imshow('bgr', img)
cv2.imshow('bgr_equ', equ)
cv2.waitKey()
cv2.destroyAllWindows()

上述代码将BGR通道进行了分离,然后分别进行直方图均衡化,最后再将结果给合并起来。

ps:opencv读取的图片默认是BGR格式的,而不是RGB格式的。

来看看效果吧。

一个原图,一个效果图,可以发现效果很差,把我们原先的色彩都给打乱了。特别是图像的上半部分直接颜色都变了。

那么这是为啥呢。

这个就需要了解一下什么是色彩空间了。

色彩是一种感性的认识,科学家们为了去表示色彩就发明了许多的色彩空间,比如RGB,YUV,HSV,HSI,HSL等多种表示方式,每一种使用范围也不太一样。

比如RGB色彩空间把图像用红色,绿色,蓝色来表示,但是这种色彩空间把图像的亮度和色度混在了一起进行表示,也就是不区分luma和chroma 的值,这样在对其中某一个进行变换的时候就会把另外一个也进行了变换。比如在进行直方图均衡化的时候是对luma进行操作的,由于RGB混在一起的表示形式就会把chroma也给搞乱掉,这样就表现出来了上图的效果。

如果是对图像进行线性变换的话还能恢复过来,如果是非线性的变化那岂不是搞不回来了,把另外一个彻底搞乱掉了。

而YUV色彩空间用Y来表示亮度,用UV表示色度,这样单独对Y通道进行直方图均衡化就可以了,不会对色度产生影响。

import cv2


img = cv2.imread(r'E:python_image_simpythonProjectsimimgimg.png')


y, u, v = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2YUV))


b, g, r = cv2.split(img)
equ_b = cv2.equalizeHist(b)
equ_g = cv2.equalizeHist(g)
equ_r = cv2.equalizeHist(r)
equ_y = cv2.equalizeHist(y)
yuv = cv2.merge([equ_y, u, v])
yuv = cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR)


equ = cv2.merge([equ_b, equ_g, equ_r])


# stacking images side-by-side
cv2.imshow('rgb', img)
cv2.imshow('bgr_equ', equ)
cv2.imshow('yuv_equ',yuv)
cv2.waitKey()
cv2.destroyAllWindows()









上述代码将BGR色彩空间转为YUV,然后对Y通道进行直方图均衡化,最后再转回BGR色彩空间。

来看看效果图。

直方图均衡化后比直接RGB直方图的效果要好很多。

最后这个对比图是通过matplotlib画出来的,需要注意的是matplotlib默认是RGB模式的,所以需要将BGR转为RGB才能正常显示出来。

import matplotlib.pyplot as plt


img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
equ = cv2.cvtColor(equ, cv2.COLOR_BGR2RGB)
yuv = cv2.cvtColor(yuv, cv2.COLOR_BGR2RGB)
plt.figure()
plt.subplot(1, 3, 1)
plt.imshow(img)
plt.title("img")
plt.subplot(1, 3, 2)
plt.imshow(equ)
plt.title("bgr_equ")
plt.subplot(1, 3, 3)
plt.title("yuv_euq")
plt.imshow(yuv)


plt.show()

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21320

    浏览量

    593192
  • 图像处理
    +关注

    关注

    26

    文章

    1224

    浏览量

    55823
  • RGB
    RGB
    +关注

    关注

    4

    文章

    763

    浏览量

    57407
  • 直方图
    +关注

    关注

    0

    文章

    19

    浏览量

    7830

原文标题:FPGA图像处理--为什么不直接对RGB图像做处理呢?

文章出处:【微信号:FPGA开源工坊,微信公众号:FPGA开源工坊】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    急求直方图均衡的Verilog代码或者是FPGA上算法处理的资料,多谢了

    急求直方图均衡的Verilog代码或者是FPGA上算法处理的资料,多谢了
    发表于 06-02 17:51

    使用LabVIEW编程实现直方图均衡

    使用LabVIEW编程实现直方图均衡
    发表于 11-13 20:24

    基于FPGA的图像直方图均衡处理

    的请求,并驱动液晶显示器显示视频图像。本实例除了前面提到对原始图像DDR3缓存和显示,还会在原始图像缓存到DDR3之前,会对当前图像直方图统计(以帧为单位统计),统计后的
    发表于 07-14 17:26

    如何实现视频图像灰度信号直方图均衡

    直方图均衡作为一种基础的图像处理方法在很多领域得到应用,但大多是通过DSP或者CPU编程实现,其优点是灵活性比较高,调试方便,最大的缺点是很难做到实时或者准实时处理,这在某些领域是不可接受的。
    发表于 11-08 08:25

    【干货】基于FPGA的图像处理(图像增强)之直方图均衡

    什么呢?是增强图像的对比度。先来看下在Matlab中实现直方图均衡的效果吧。图片比较随意,直接对电脑桌面截了一张,大家应该能有一个直观的感受,知道
    发表于 12-08 09:40

    玩转Zynq连载47——[ex66] MT9V034摄像头的图像直方图均衡处理

    图像缓存到DDR3之前,会对当前图像直方图统计(以帧为单位统计),统计后的直方图结果进行均衡运算,获得新的图像映射数据,然后用于紧随着的
    发表于 01-02 09:25

    【正点原子FPGA连载】第十章基于OV5640的直方图均衡实验-领航者ZYNQ之HLS 开发指南

    图像的直方图分布变成近似均匀分布(均衡),从而增强图像的对比度。如下图所示: 10.1.4 直方图均衡
    发表于 10-14 16:02

    labview直方图均衡化时阈值跟随图像灰度值范围变化的部分如何编写?

    在做直方图均衡化时要对图像灰度处理,如何选取图中灰度值集中的部分做均衡?将这个范围做为处理的上下阈值。希望大家都来发表自己的想法。
    发表于 04-28 20:16

    TI C6000教学实验箱操作教程:5-8 直方图均衡(LCD显示)

    一、实验目的 学习直方图均衡的原理,掌握图像的读取方法,并实现在LCD上显示直方图均衡前后的
    发表于 12-07 14:20

    保持图像细节的直方图均衡算法

    对常规的直方图均衡算法进行了改进,避免了不同灰度的像素均衡后被合并、图像细节丢失等现象。实验结果表明,改进的直方图均衡新算法既能充分增强图像
    发表于 11-09 16:50 21次下载

    RGB三色直方图的绘制

    《OpenCV3编程入门》书本配套源代码:RGB三色直方图的绘制
    发表于 06-06 15:20 17次下载

    直方图均衡化_《OpenCV3编程入门》书本配套源代码

    《OpenCV3编程入门》书本配套源代码:直方图均衡
    发表于 06-06 15:52 6次下载

    MATLAB如何实现图像增强灰度变换直方图均衡匹配

    在MATLAB数字图像处理领域,如何实现空间域图像增强的灰度变换,以及图像直方图均衡和匹配(配准)?本文通过大量的图片增强案例,从图像的显示效果和灰度直方图分析入手,通过自编程,详细地讲解了图像
    发表于 01-13 21:56 1w次阅读
    MATLAB如何实现图像增强灰度变换<b class='flag-5'>直方图</b><b class='flag-5'>均衡</b>匹配

    直方图均衡化的原理及OpenCV的算法和代码实现免费下载

    直方图均衡化是想把左边的直方图变换为右边的直方图,使各个灰度值上的像素个数均匀分布,这样图像整体的亮度分布较均匀,不会过亮或过暗,同时可以增加图像的对比度。
    发表于 09-25 11:10 8次下载
    <b class='flag-5'>直方图</b><b class='flag-5'>均衡</b>化的原理及OpenCV的算法和代码实现免费下载

    直接灰度变换和直方图均衡的数字图像处理实验资料免费下载

    本文档的主要内容详细介绍的是直接灰度变换和直方图均衡的数字图像处理实验资料免费下载。
    发表于 12-23 08:00 3次下载
    <b class='flag-5'>直接</b>灰度变换和<b class='flag-5'>直方图</b><b class='flag-5'>均衡</b>的数字图像处理实验资料免费下载