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);

     

  • 相关阅读:
    Verilog非阻塞赋值的仿真/综合问题 (Nonblocking Assignments in Verilog Synthesis)上
    异步FIFO结构及FPGA设计 跨时钟域设计
    FPGA管脚分配需要考虑的因素
    An Introduction to Delta Sigma Converters (DeltaSigma转换器 上篇)
    An Introduction to Delta Sigma Converters (DeltaSigma转换器 下篇)
    中国通信简史 (下)
    谈谈德国大学的电子专业
    中国通信简史 (上)
    Verilog学习笔记
    Verilog非阻塞赋值的仿真/综合问题(Nonblocking Assignments in Verilog Synthesis) 下
  • 原文地址:https://www.cnblogs.com/yongheng20/p/4944859.html
Copyright © 2011-2022 走看看