灰度图像反转和彩色图像反转

  前面的博客中我们分别用两种方法实现了彩色图像转灰度的算法,本篇博客则整理一下灰度图像反转和彩色图像反转的实现。

一、反转像介绍

  "用摄影设备制成的人或物的形象,也包括光线经反射、折射而形成的与原物相似的图景,图像的色调或明暗的处理呈反转效果的图像。"

——百度百科《反转像》

  反转像在很多场合都有运用,例如在一些质量很差的照片,比如从视频里裁取的照片,一定要先插值放大,然后进行反转像处理,锐度和对比度要调高一些,打印时和数码相机照的相反,要稍微调暗一些,这样打印出的照片效果更好。在冲洗之初显示为负像,经中途曝光后再次显影时转为正像。它能把底片上的负像印为正像,使影像的明暗或色彩与被摄体相同。

二、灰度图像反转

  之前我们实现了RGB转YCbCr的算法,并且将 Y 分量取出作为灰度数据,而反转也正是对灰度数据进行操作,其原理也很简单,如果一幅灰度图像的灰度级是[0,L-1],那反转图像为:s = L-1-r = L - (1+r) = L - r[r:0],r 为原图像灰度级。

1、MATLAB实现

 1 %--------------------------------------------------------------------------
 2 %                       灰度图像反转
 3 %--------------------------------------------------------------------------
 4 clc;
 5 clear all;
 6 RGB = imread('Lenna.jpg');  %读取图像
 7 
 8 gray = rgb2gray(RGB);       %灰度图
 9 
10 inve1 = imcomplement(gray); %函数法图像反转
11 inve2 = 255 - gray;         %公式法图像反转
12 
13 subplot(3,1,1);imshow(gray); title('灰度图像');
14 subplot(3,1,2);imshow(inve1);title('函数法图像反转');
15 subplot(3,1,3);imshow(inve2);title('公式法图像反转');

  这里我分别采用了函数法和公式法实现灰度图像反转,以验证我们的公式是否正确,255是因为Y分量是8位的,灰度级是8‘b1111_1111=255,点击运行得到如下结果:

  从结果看出,两种方式得到的反转图像一样,证明我们的公式是没错的。

2、FPGA实现

  FPGA的实现也很简单,只需要在原来的灰度图像的基础上,对 YCbCr 的 Y 分量进行公式法处理即可,关键代码如下所示:

//==========================================================================
//==    灰度反转,复制给RGB通道
//==========================================================================
assign inve_Y    = 8'd255 - Y2; //灰度反转
assign inve_data = {inve_Y[7:3],inve_Y[7:2],inve_Y[7:3]};

  其中 Y2 即原先RGB转YCbCr后的Y分量,我们对其进公式法处理,最终的值再赋值给RGB通道即可。

3、上板验证

  由于我的开发板引脚有问题,导致色彩全都出现失真了。上板验证我是做了,最终和 MATLAB 的结果是一样的,上板验证的图等学校开学换了FPGA开发板后再补上。

三、彩色图像反转

  灰度图像反转很简单,那彩色图像反转呢?  

  一开始我以为是将 YCbCr 的三个分量分别进行类似处理,然后赋值给RGB通道,最后实验失败,因为TFT(VGA)是只支持RGB格式的,直接赋值YCbCr数据肯定会导致图像错误。后来我又想那就再进行YCbCr转RGB565的处理总可以了吧,可以是可以,但有点太麻烦了,彩色图像哪有那么复杂!

  最后在 Lee 神的指点下,我明白了其实只要对RGB分量进行类似的公式法处理即可,甚至比灰度图像反转的处理更简单!

1、MATLAB实现

 1 %--------------------------------------------------------------------------
 2 %                       彩色图像反转
 3 %--------------------------------------------------------------------------
 4 clc;
 5 clear all;
 6 RGB = imread('Lenna.jpg');  %读取图像
 7 
 8 inve1 = imcomplement(RGB);  %函数法图像反转
 9 
10 inve2 =  255 - RGB;         %公式法图像反转
11 
12 subplot(3,1,1);imshow(RGB);  title('原图');
13 subplot(3,1,2);imshow(inve1);title('函数法图像反转');
14 subplot(3,1,3);imshow(inve2);title('公式法图像反转');

  代码第10行我采用了偷懒的写法,实际上RGB是3维数据,255会分别对RGB通道做三次减法。同样的,采用了两种方式实现,以验证公式法的正确性,点击运行得到如下结果:

  从结果看出,两种方式得到的反转图像一样,证明我们的公式是没错的。

2、FPGA实现

  彩色图像的反转比灰度图像反转更简单,直接对RGB通道进行公式法处理即可,关键代码如下所示:

assign inve_R = 5'b11111  - RGB_data[15:11];
assign inve_G = 6'b111111 - RGB_data[10:5];
assign inve_B = 5'b11111  - RGB_data[4:0];

assign inve_data  = {inve_R,inve_G,inve_B};

  RGB_data即图像的原始数据,inve_data即反转后的图像数据,甚至连时钟、复位信号都没有用到,非常简单!

3、上板验证

  由于我的开发板引脚有问题,导致色彩全都出现失真了。上板验证我是做了,最终和 MATLAB 的结果是一样的,上板验证的图等学校开学换了FPGA开发板后再补上。

参考资料:[1]OpenS Lee FPGA开源工作室(公众号)

猜你喜欢

转载自www.cnblogs.com/xianyufpga/p/12470873.html