分类
程序设计

彩色图转为灰度图和黑白图方法

在图像处理中,我们通常把彩色图像转为灰度图像,或者黑白图,然后再实现一些相关的计算和识别,比如图像识别等,是计算机视觉方面最常用的一种基本方法。进行了转换之后,很多事情就变得简单方便起来。

我们都知道,图片可以看作是一个矩阵,一个包含RGB的彩色图片,可以看作为三维的矩阵。第一维是长,第二维是宽,第三维依次代表着G、B、R的值,可以看作这三种颜色叠加而成。

彩色图像转为灰度图像的时候,我们只需将每一个像素点的RGB三种原色按一定的系数比例求期望值,然后将每一个像素的RGB值全部置为该点的期望值即可。彩色图像转为灰度图像的RGB系数分别为0.299、0.587、0.114,那么我们可以得到以下公式:

Y = 0.299 R + 0.587 G + 0.114 B

         假设我们在磁盘D盘有一个img.jpg的图片文件,你可以使用任意图片来实验,建议尺寸别太大,否则计算时间可能会较长。图片的格式读取起来相对较复杂,尤其是文件头,而且也是不好处理,为了方便起见,我们使用MATLAB来实现:

I = imread('D:\img.jpg');
[row,col,m]=size(I);
figure(1);
imshow(I);
%imwrite(I,'D:\r0.jpg');
J(row,col,m)=0;
for i=1:row
    for j=1:col
        J(i,j,1:3) = (0.114*I(i,j,1)+0.587*I(i,j,2)+0.299*I(i,j,3));%系数依次为GBR的系数
       J(i,j,1:3)=J(i,j,1:3)./255;
    end
end
figure(2);
imshow(J);

通过以上代码我们就可以实现彩色图像转为灰度图像了。如果我们还要转为黑白图片怎么办?那就在灰度图片的基础上进行0-1二值化。我们首先求整个矩阵的期望值,以此作为二值化的临界点,然后遍历每一个像素点,当大于等于这个值时,我们将其更改为1,否则更改为0,部分MATLAB编译器需要更改为255和0。同样,我们继续使用MATLAB来实现:

K(row,col,m)=0;
qiwang=mean(J);
for i=1:row 
    for j=1:col
        if(J(i,j,1)>=qiwang)
            K(i,j,1:3)=1;
        else
            K(i,j,1:3)=0;
        end
    end
end
figure(3);
imshow(K);

这样一来,一幅黑白图片又生成了。如果我们想将图片保存下来,可以再使用以下代码:

imwrite(J,'D:\r1.jpg');
imwrite(K,'D:\r2.jpg');

最后我们再来做一个时间复杂度分析,由于图片是三维矩阵,其中一维维度固定为3,所以,设图像长为m宽为n,那么耗时为m*n*3,计算的时间复杂度为O(m*n)。由此可以看出一般情况下的时间复杂度近似为n2

 

写在最后:
鉴于本人水平有限,如果文章中有什么错误之处,欢迎指正,非常感谢。

版权声明
本博客的文章除特别说明外均为原创,本人版权所有。欢迎转载,转载请注明作者及来源链接,谢谢。
本文地址: https://blog.ailemon.net/2017/02/27/color-image-to-grayscale-and-black-white/
All articles are under Attribution-NonCommercial-ShareAlike 4.0

关注“AI柠檬博客”微信公众号,及时获取你最需要的干货。


发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

18 − 7 =

如果您是第一次在本站发布评论,内容将在博主审核后显示,请耐心等待