zoukankan      html  css  js  c++  java
  • 数字图像处理实验(16):PROJECT 06-03,Color Image Enhancement by Histogram Processing 标签: 图像处理MATLAB 2017

    实验要求:

    Objective:
    To know how to implement image enhancement for color images by histogram processing. Note that the definition of histogram for color images differs from that of histogram for gray images.
    Main requirements:
    Ability of programming with C, C++, or Matlab.
    Instruction manual:
    (a) Download the dark-stream color picture in Fig. 6.35 (this image is labeled Fig. 6.35(05) in the image gallery for Chapter 6). Convert the image to RGB (see comments at the beginning of Project 06-01). Histogram-equalize the R, G, and B images separately using the histogram-equalization program and convert the image back to jpg format.
    (b) Form an average histogram from the three histograms in (a) and use it as the basis to obtain a single histogram equalization intensity transformation function. Apply this function to the R, G, and B components individually, and convert the results to jpg. Compare and explain the differences in the jpg images in (a) and (b).

    本实验是对彩色图像进行直方图均衡化处理。其中,我分了两种方式对彩色图像进行处理。一种是对图像的R、G、B三个彩色分量进行直方图均衡化,另一种是将图像从RGB颜色空间转换到HSI颜色空间,使用直方图均衡化单独处理亮度I分量,随后将图像从HSI空间转换回到RGB颜色空间。对比两种处理方法的结果。

    实验代码:

    %%
    close all;
    clc;
    clear all;
    
    %%
    img = imread('Fig6.35(5).jpg');
    figure
    subplot(1,3,1);
    imshow(img);
    title('original image');
    
    %% 对RGB3个通道的灰度值分别做直方图均衡化,然后再合为一幅新的图像
    R = img(:, :, 1);
    G = img(:, :, 2);
    B = img(:, :, 3);
    
    A = histeq(R);
    B = histeq(G);
    C = histeq(B);
    
    img1 = cat(3, A, B, C);
    
    subplot(1,3,2);
    imshow(img1);
    title('histogram-equalization 1');
    
    %% 先将RGB格式的图像转换为HSI格式的图像,然后再对亮度I做直方图均衡化,紧接着转换成RGB格式的图像
    
    img_hsi = rgb2hsi(img);
    img_hsi_i = img_hsi(:, :, 3);
    img_hsi_I = histeq(img_hsi_i);
    img_hsi(:, :, 3) = img_hsi_I;
    img2 = hsi2rgb(img_hsi);
    
    subplot(1,3,3);
    imshow(img2);
    title('histogram-equalization 2');

    补充:
    程序中使用的一些函数,RGB和HSI颜色空间之间相互转换的程序:
    hsi2rgb()函数:

    function rgb = hsi2rgb(hsi)
    %HSI2RGB Converts an HSI image to RGB.
    %   RGB = HSI2RGB(HSI) converts an HSI image to RGB, where HSI is
    %   assumed to be of class double with:  
    %     hsi(:, :, 1) = hue image, assumed to be in the range
    %                    [0, 1] by having been divided by 2*pi.
    %     hsi(:, :, 2) = saturation image, in the range [0, 1].
    %     hsi(:, :, 3) = intensity image, in the range [0, 1].
    %
    %   The components of the output image are:
    %     rgb(:, :, 1) = red.
    %     rgb(:, :, 2) = green.
    %     rgb(:, :, 3) = blue.
    
    %   Copyright 2002-2004 R. C. Gonzalez, R. E. Woods, & S. L. Eddins
    %   Digital Image Processing Using MATLAB, Prentice-Hall, 2004
    %   $Revision: 1.5 $  $Date: 2003/10/13 01:01:06 $
    
    % Extract the individual HSI component images.
    H = hsi(:, :, 1) * 2 * pi;
    S = hsi(:, :, 2);
    I = hsi(:, :, 3);
    
    % Implement the conversion equations.
    R = zeros(size(hsi, 1), size(hsi, 2));
    G = zeros(size(hsi, 1), size(hsi, 2));
    B = zeros(size(hsi, 1), size(hsi, 2));
    
    % RG sector (0 <= H < 2*pi/3).
    idx = find( (0 <= H) & (H < 2*pi/3));
    B(idx) = I(idx) .* (1 - S(idx));
    R(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx)) ./ ...
                                              cos(pi/3 - H(idx)));
    G(idx) = 3*I(idx) - (R(idx) + B(idx));
    
    % BG sector (2*pi/3 <= H < 4*pi/3).
    idx = find( (2*pi/3 <= H) & (H < 4*pi/3) );
    R(idx) = I(idx) .* (1 - S(idx));
    G(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx) - 2*pi/3) ./ ...
                        cos(pi - H(idx)));
    B(idx) = 3*I(idx) - (R(idx) + G(idx));
    
    % BR sector.
    idx = find( (4*pi/3 <= H) & (H <= 2*pi));
    G(idx) = I(idx) .* (1 - S(idx));
    B(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx) - 4*pi/3) ./ ...
                                               cos(5*pi/3 - H(idx)));
    R(idx) = 3*I(idx) - (G(idx) + B(idx));
    
    % Combine all three results into an RGB image.  Clip to [0, 1] to
    % compensate for floating-point arithmetic rounding effects.
    rgb = cat(3, R, G, B);
    rgb = max(min(rgb, 1), 0);

    rgb2hsi()函数:

    function hsi = rgb2hsi(rgb)
    %RGB2HSI Converts an RGB image to HSI.
    %   HSI = RGB2HSI(RGB) converts an RGB image to HSI. The input image
    %   is assumed to be of size M-by-N-by-3, where the third dimension
    %   accounts for three image planes: red, green, and blue, in that
    %   order. If all RGB component images are equal, the HSI conversion
    %   is undefined. The input image can be of class double (with values
    %   in the range [0, 1]), uint8, or uint16. 
    %
    %   The output image, HSI, is of class double, where:
    %     hsi(:, :, 1) = hue image normalized to the range [0, 1] by
    %                    dividing all angle values by 2*pi. 
    %     hsi(:, :, 2) = saturation image, in the range [0, 1].
    %     hsi(:, :, 3) = intensity image, in the range [0, 1].
    
    %   Copyright 2002-2004 R. C. Gonzalez, R. E. Woods, & S. L. Eddins
    %   Digital Image Processing Using MATLAB, Prentice-Hall, 2004
    %   $Revision: 1.5 $  $Date: 2005/01/18 13:44:59 $
    
    % Extract the individual component images.
    rgb = im2double(rgb);
    r = rgb(:, :, 1);
    g = rgb(:, :, 2);
    b = rgb(:, :, 3);
    
    % Implement the conversion equations.
    num = 0.5*((r - g) + (r - b));
    den = sqrt((r - g).^2 + (r - b).*(g - b));
    theta = acos(num./(den + eps));
    
    H = theta;
    H(b > g) = 2*pi - H(b > g);
    H = H/(2*pi);
    
    num = min(min(r, g), b);
    den = r + g + b;
    den(den == 0) = eps;
    S = 1 - 3.* num./den;
    
    H(S == 0) = 0;
    
    I = (r + g + b)/3;
    
    % Combine all three results into an hsi image.
    hsi = cat(3, H, S, I);

    程序运行结果:
    这里写图片描述

  • 相关阅读:
    C#通过反射获取类中的方法和参数个数,反射调用方法带参数
    C#利用WinRAR实现压缩和解压缩
    C# 使用HttpWebRequest Post提交数据,携带Cookie和相关参数示例
    C#使用Linq To XML读取XML,Linq生成XML,Linq创建带属性或带节点XML
    MVC使用Newtonsoft无需实体类,实现JSON数据返回给前端页面使用
    JSON对象与字符串之间的相互转换
    Javascript正则表达式详细讲解和示例,通俗易懂
    C#比较两个list集合,两集合同时存在或A集合存在B集合中无
    Uploadify 3.2上传文件,限制类型,大小,传递参数等
    c# 反射得到实体类的字段名称和值,DataTable转List<T>
  • 原文地址:https://www.cnblogs.com/xuhongbin/p/7134154.html
Copyright © 2011-2022 走看看