zoukankan      html  css  js  c++  java
  • 图像处理(二)——使用HSI和HSV颜色空间来调整图像颜色

    图像颜色调整

    1. 介绍

      编写一段Matlab代码使用HSI和HSV颜色空间来调整图像颜色。

    2. 实验方法

      输入为图像以及三个通道的调整系数,输出为调整后的图片。代码中首先将三个通道提取出来,按调整系数进行调整,之后再将三通道合并,生成输出的图像。最后将调整后的图像与photoshop中对应的结果进行对比,描述photoshop中颜色调整可能用到的方法。

    3. 实验结果及分析

      3.1 色度调整:增加50和减少40色度值

      3.2 饱和度调整:增加30和减少20饱和度

      3.3 明度调整:增加60和减少30明度

    4. matlab代码

      4.1 process_hsv_hsi.m

    clc, clear;
    close all;
    
    h = input('Adjust hue by: ');        % 输入色度调整参数h
    s = input('Adjust saturation by: ');        % 输入饱和度调整参数s
    v = input('Adjust intensity by: ');        % 输入明度调整参数v
    
    I = imread('Lenna.png');    % 读取源图像并显示
    figure(1);
    imshow(I);
    % HSV颜色空间处理
    hsv_image = rgb2hsv(I);        % 将rgb颜色空间转换为hsv颜色空间
    hue = hsv_image(:,:,1);        % 提取色度通道
    sat = hsv_image(:,:,2);        % 提取饱和度通道
    int = hsv_image(:,:,3);        % 提取明度通道
    
    hue = hue + 1 / 360 * h;    % 对各通道进行处理
    sat = sat + 0.01 * s;
    int = int + 0.01 * v;
    
    %hue(hue>1)=hue(hue>1) - 1; hue(hue<0)=1 - hue(hue<0);
    hue(hue>1)=1; hue(hue<0)=0;
    sat(sat>1)=1; sat(sat<0)=0;
    int(int>1)=1; int(int<0)=0;
    
    hsv_image(:,:,1) = hue;        % 运算后的各通道返回原图
    hsv_image(:,:,2) = sat;
    hsv_image(:,:,3) = int;
    
    % matlab 无法直接显示hsv和hsi图像,还要先转换为rgb
    rgb = hsv2rgb(hsv_image);    % 将hsv颜色空间转换为rgb颜色空间,并显示
    figure(2);
    imshow(rgb);
    
    % HSI颜色空间处理
    hsi_image = rgb2hsi(I);        % 将rgb颜色空间转换为hsi颜色空间
    hue = hsi_image(:,:,1);        % 提取色度通道
    sat = hsi_image(:,:,2);        % 提取饱和度通道
    int = hsi_image(:,:,3);        % 提取明度通道
    
    hue = hue + 1 / 360 * h;    % % 对各通道进行处理
    sat = sat + 0.01 * s;
    int = int + 0.01 * v;
    
    %hue(hue>1)=hue(hue>1) - 1; hue(hue<0)=1 - hue(hue<0);
    hue(hue>1)=1; hue(hue<0)=0;
    sat(sat>1)=1; sat(sat<0)=0;
    int(int>1)=1; int(int<0)=0;
    
    hsi_image(:,:,1) = hue;        % 运算后的各通道返回原图
    hsi_image(:,:,2) = sat;
    hsi_image(:,:,3) = int;
    
    rgb = hsi2rgb(hsi_image);    % 将hsi颜色空间转换为rgb颜色空间,并显示
    figure(3);
    imshow(rgb);

    4.2 rgb2hsi.m

      由于matlab没有rgb2hsi函数所以要自己写一个,直接命名为abc.m就可以在同目录下其他.m文件中调用。

      MATLAB的m文件分为两种。

      一种为脚本文件,就是由一堆命令构成的,里面第一行不是function开头,这种文件比如是myfun.m 就在命令窗口里输入myfun回车就行,matlab会把m文件中的命令都运行一次。

      另一种为函数文件,第一行为function ,比如说 function y=myfun(x),这种文件函数名与文件名必须是一致的,在命令窗口里输入myfun(x), x是运行参数,回车即运行。

      要注意的是,不同于C语言,matlab的m文件不允许脚本和函数在同一个m文件中。

      代码:

    function hsi=rgb2hsi(rgb)
    %根据书上P260-261页公式实现本函数
    rgb=im2double(rgb);
    r=rgb(:,:,1);
    g=rgb(:,:,2);
    b=rgb(:,:,3);
    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;
    hsi=cat(3,H,S,I);

    4.3 hsi2rgb.m

      同样需要写一个hsi2rgb.m

      代码:

    function rgb=hsi2rgb(hsi)
    %根据书上P260-261页公式实现本函数
    H=hsi(:,:,1)*2*pi;
    S=hsi(:,:,2);
    I=hsi(:,:,3);
    R=zeros(size(hsi,1),size(hsi,2));
    G=zeros(size(hsi,1),size(hsi,2));
    B=zeros(size(hsi,1),size(hsi,2));
    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));
    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));
    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));
    rgb=cat(3,R,G,B);
    rgb=max(min(rgb,1),0);

     

  • 相关阅读:
    Bootstrap(项目2)
    Bootstrap(项目1)
    Bootstrap(Carousel幻灯片)轮播图
    Bootstrap(滚动监听)
    Bootstrap基础10(标签页)
    Bootstrap基础9(工具提示框、警告框、弹出框)
    Bootstrap基础8(模态框(弹窗))
    Bootstrap基础7(标签、徽章、大屏展播、页面标题、缩略图、进度条、面板、折叠效果)
    Bootstrap基础6(路径导航)
    2018~2019学年下学期《计算机图像处理》
  • 原文地址:https://www.cnblogs.com/yongheng20/p/4944859.html
Copyright © 2011-2022 走看看