灰度图像反转和彩色图像反转
Posted xianyufpga
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了灰度图像反转和彩色图像反转相关的知识,希望对你有一定的参考价值。
前面的博客中我们分别用两种方法实现了彩色图像转灰度的算法,本篇博客则整理一下灰度图像反转和彩色图像反转的实现。
一、反转像介绍
"用摄影设备制成的人或物的形象,也包括光线经反射、折射而形成的与原物相似的图景,图像的色调或明暗的处理呈反转效果的图像。"
——百度百科《反转像》
反转像在很多场合都有运用,例如在一些质量很差的照片,比如从视频里裁取的照片,一定要先插值放大,然后进行反转像处理,锐度和对比度要调高一些,打印时和数码相机照的相反,要稍微调暗一些,这样打印出的照片效果更好。在冲洗之初显示为负像,经中途曝光后再次显影时转为正像。它能把底片上的负像印为正像,使影像的明暗或色彩与被摄体相同。
二、灰度图像反转
之前我们实现了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开源工作室(公众号)
以上是关于灰度图像反转和彩色图像反转的主要内容,如果未能解决你的问题,请参考以下文章