您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

手把手教你用Python给小姐姐美个颜

5b51 2022/1/14 8:18:20 python 字数 21316 阅读 401 来源 www.jb51.cc/python

01图像的颜色空间彩色图像比灰度图像拥有更丰富的信息,它的每个像素通常是由红(R)、绿(G)、蓝(B)3个分量来表示的,每个分量介于0~255之间。图像中呈现的不同的颜色都是由R、G、B这3种颜色混合而成的。在OpenCV里面,彩色图像拥有3个颜色通道,但是通道的顺序是可以变换的,RGB、BRG、BGR、GBR、GR

概述


彩色图像比灰度图像拥有更丰富的信息,它的每个像素通常是由红(R)、绿(G)、蓝(B)3个分量来表示的,每个分量介于0~255之间。
图像中呈现的不同的颜色都是由R、G、B这3种颜色混合而成的。在OpenCV里面,彩色图像拥有3个颜色通道,但是通道的顺序是可以变换的,RGB、BRG、BGR、GBR、GRB都有可能。
在读取一幅图像的时候,我们对于图像的颜色通道排布并不清楚,因此需要先把图像的颜色通道固定下来,这就需要调用OpenCV的cvtColor()函数
cvtColor()函数功能是对图像进行颜色空间变换,原型如下:

dst=cv2.cvtColor(src, code )


函数输出进行颜色空间变换后存储图像。
通过调用cvtColor()函数,还可以将一幅彩色图像转换成灰度图像,示例代码见程序3-5,代码运行效果如图3.9所示。

图片

彩色图像1.jpg

# -*- coding: UTF-8 -*-
import numpy as np
import cv2
#定义main()函数
def main():
   img = cv2.imread('1.jpg')
   img2 = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
                                          #从彩色图像转化成灰度图像
   cv2.imshow('img2.bmp ', img2)
   cv2.waitKey(0)
if __name__ == '__main__':
   main()

图片

▲图3.9 color2gray.py程序运行结果
注意:cvtColor()函数还可以通过改变参数cv2.COLOR_RGB2BRG等改变图像颜色通道的排列顺序。另外也可以直接在读取图像函数imread时设置参数为0,直接将彩色图像读取为灰度图像,img = cv2.imread('1.jpg',0)。

02 彩色图像的通道分离和混合
灰度图像是单通道的,彩色图像拥有R、G、B三个颜色通道。因此在图像处理时,经常把颜色通道分离,单独处理一个通道的数组,然后再合并成一幅彩色图像。
在实际的代码编写中,只需要调用OpenCV中的split()和merge()函数就可以实现图像的通道分离和合并。
split()函数功能是将多通道的矩阵分离成单通道矩阵,原型如下:

[,mv]=cv2.split (src)
dst=cv2.merge([,dst] )
# -*- coding: UTF-8 -*-
import numpy as np
import cv2
#定义main()函数
def main():
   img = cv2.imread('1.jpg')    
   img2 = cv2.cvtColor(img,cv2.COLOR_BRG2RGB)
   r,g,b = cv2.split(img2)   #img分离成三个单通道的图像
   cv2.imshow("Red", r)
   cv2.imshow("Green", g)
   cv2.imshow("Blue", b)
   cv2.waitKey(0)
if __name__ == '__main__':
   main()

图片

▲图3.10 colorsplit.py程序运行结果
可以看出,在图像通道分离后,不同颜色通道的图像显示深浅不一,单通道的图像呈现该颜色通道的灰度信息。接下来把这3个颜色通道混合一下,在代码中加入一行代码:img3 = cv2.merge([b,g,r]);,这样img3又回到了原来输入的彩色图像样式,显示效果如图3.11所示。

图片

▲图3.11 图像三通道混合后的输出

04 彩色图像的二值化
图像的二值化是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果彩色图像二值化最简单的步骤如下:


其中,阈值的操作会调用OpenCV的threshold()函数
threshold()函数声明如下:

ret, dst = cv2.threshold(src, thresh, maxval, type);


举例参考程序3-7。

# -*- coding: UTF-8 -*-
import numpy as np
import cv2
#定义main()函数
def main():
   img = cv2.imread('1.jpg',0)
   thresh1,dst =cv2.threshold(img,127,255,cv2.THRESH_BINARY)
                                               #图像二值化
   cv2.imshow("dst", dst)
   cv2.waitKey(0)
if __name__ == '__main__':
   main()

图片

▲图3.12 colorthreshold.py程序输出结果

05 彩色图像的遍历
灰度图像的遍历按照访问二维数组的方式得到坐标位置的像素。那对于彩色图像呢?彩色图像可以看出是3维数组,遍历方式参见程序3-8。

# -*- coding: UTF-8 -*-
import numpy as np
import cv2
#定义main()函数
def main():
   img = cv2.imread('1.jpg')    
   height,width,n = img.shape #得到图片的宽高和维度
   img2 = img.copy()  #复制一个跟img相同的新图片
   #宽高两个维度遍历图片
   for i in range(height):
      for j in range(width):
         img2[i, j][0] = 0 #将第一个通道内的元素重新赋值
   cv2.imshow('img2.jpg', img2)
   cv2.waitKey(0)
if __name__ == '__main__':
   main()

图片

▲图3.13 color1.py程序运行结果
在读取不同通道的图像像素值时,需要先确定图像的通道排列是RGB还是BRG。

06 彩色图像和灰度图像的转换
经过前面的学习,我们知道彩色图像转成灰度图像有3种路径:


那么灰度图像有没有可能转换成彩色图像呢?
我们知道灰度图像是单通道的,彩色图像是RGB 3这个颜色通道。那么是否可以人为地增加图像的通道,伪造出另外两个通道,而另外两个通道可以随机地赋值呢?程序3-9做出了尝试。

# -*- coding: UTF-8 -*-
import numpy as np
import cv2
#定义main()函数
def main():
   img = cv2.imread('gray1.jpg')    
   gray = np.zeros((512, 512, 3), np.uint8)  # 生成一个彩色图像
   height,width,n = img.shape
   #图像像素级遍历
   for i in range(height):
      for j in range(width):
         gray[i, j][0] = img[i, j][0]
         gray[i, j][1] = 0
         gray[i, j][2] = 0
   cv2.imshow('gray.jpg', gray)
   cv2.waitKey(0)
=if __name__ == '__main__':
   main()

图片

▲图3.14 gray2color1.py程序运行结果
上述方法转换的图像颜色很单一。有没有更加智能的方法呢?在摄像技术不是很成熟的时期,人们给拍摄出来的黑白照片上色,发明了一种伪彩色图像技术。在OpenCV里面,可以用预定义好的Colormap(色度图)来给图片上色,示例代码参见程序3-10。

程序3-10 伪彩色图像技术示例:

gray2color2.py

# -*- coding: UTF-8 -*-
import numpy as np
import cv2
#定义main()函数
def main():
   img = cv2.imread('gray1.jpg')    
   im_color = cv2.applyColorMap(img, cv2.COLORMAP_JET)  #色度图上色
   cv2.imshow("im_color.jpg", im_color)
   cv2.waitKey(0)
if __name__ == '__main__':
   main()

图片

▲图3.15 gray2color程序运行结果

在大数据DT(ID:hzdashuju)后台对话框回复美颜,可获取本文源代码

总结

以上是编程之家为你收集整理的手把手教你用Python给小姐姐美个颜全部内容,希望文章能够帮你解决手把手教你用Python给小姐姐美个颜所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶