Advertisement

数字图像与机器视觉基础(2)

阅读量:

一、彩色图像文件转换为灰度文件

(一)使用opencv

1.通过cvtColor库将其转为灰度
(1)代码

复制代码
 import cv2 as cv

    
 img = cv.imread('C:/Users/86199/Pictures/lena/lena.jpg',1)
    
 img_1 = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    
 cv.imshow('gray',img_1)
    
 cv.imshow('colour',img)
    
 cv.waitKey(0)

(2)结果

2通过分离RGB三个通道得到三个通道的灰度图
(1)代码

复制代码
 import cv2 as cv

    
 from matplotlib import pyplot as plt
    
 img = cv.imread('C:/Users/86199/Pictures/lena/lena.jpg',1)
    
 #cv2.imread读取图片格式是BGR
    
 b,g,r = cv.split(img)  #这个地方将图像拆分,把彩色图像分为3个颜色
    
 plt.figure(figsize=(10,8))
    
 color = [b,g,r]
    
 img_2 = cv.merge([r,g,b])  #这个地方我把bgr格式的图片转成了rgb,然后显示的时候会变成正常的彩色
    
 for i in range(3):
    
     plt.subplot(2,2,i+1)
    
     plt.imshow(color[i],'gray')
    
     plt.subplot(2,2,4)
    
     plt.imshow(img_2)
    
 plt.savefig('./三通道灰度.png')
    
 plt.show()

(2)运行结果

二)不使用opencv

1.代码

复制代码
 from PIL import Image

    
 I = Image.open('C:/Users/86199/Pictures/lena/lena.jpg')
    
 L = I.convert('L')
    
 L.show()

二、将彩色图像转化为HSV、HSI 格式
(一)彩色图像转化为HSV格式
1.HSV介绍

HSV 格式: H 代表色彩,S 代表颜色的深浅,V 代表着颜色的明暗程度。

HSV 颜色空间有效地将颜色信息与亮度信息区分开来,并分别地将其放置在不同的通道中;这种方式能够降低光线对特定颜色识别造成的干扰。

HSV( hue , saturation , lightness ),亦称HSB ,其中 B 代表亮度 ,是艺术家们常用的一种颜色模型 ;相较于加法和减法混色的术语 ,使用色调 、明暗度等概念来描述颜色更加自然直观 。HSV 其实是对 RGB 色彩空间的一种变形 ,其内容与其所依据的颜色尺度以及起源( RGB 色彩空间)有着密切的关系 。其应用领域主要集中在视觉艺术领域 。

在 OpenCV 视觉库中,HSV 值经过了一定程度的微小调整,在 H 值设定在了 0 至 180 之间的同时 S 和 V 值均设置在了 0 至 255 范围内。

复制代码
 # open-cv library is installed as cv2 in python

    
 # import cv2 library into this program
    
 import cv2 as cv
    
  
    
 # read an image using imread() function of cv2
    
 # we have to  pass only the path of the image
    
 img = cv.imread('C:/Users/86199/Pictures/lena/lena.jpg',1)
    
  
    
 # displaying the image using imshow() function of cv2
    
 # In this : 1st argument is name of the frame
    
 # 2nd argument is the image matrix
    
  
    
 cv.imshow('original image',img)
    
  
    
 # converting the colourfull image into HSV format image
    
 # using cv2.COLOR_BGR2HSV argument of
    
 # the cvtColor() function of cv2
    
 # in this :
    
 # ist argument is the image matrix
    
 # 2nd argument is the attribute
    
 hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
    
  
    
  
    
 # displaying the Hsv format image
    
 cv.imshow('HSV format image',hsv)
    
  
    
 cv.waitKey(0)

二)彩色图像转化为HSI格式
1.HSI介绍
HSL (色相hue, 饱和度saturation, 亮度lightness/luminance),
也称HLS 或 HSI (I指intensity)
与 HSV非常相似,仅用亮度(lightness)替代了明度(brightness)。

人眼对于明暗的变化感知度远高于对其色彩深浅的分辨能力。为了便于色彩处理与辨识,人类视觉系统普遍采用了HSI彩色模型这一方案;这种HSI色彩模型较之于RGB模型更能贴合人类视觉系统的特点。此外,在图像处理以及机器视觉领域内多种基于灰度值的操作均可在此框架下便捷实施

2.代码

复制代码
 import cv2

    
 import numpy as np
    
  
    
 def rgbtohsi(rgb_lwpImg):
    
   rows = int(rgb_lwpImg.shape[0])
    
   cols = int(rgb_lwpImg.shape[1])
    
   b, g, r = cv2.split(rgb_lwpImg)
    
   # 归一化到[0,1]
    
   b = b / 255.0
    
   g = g / 255.0
    
   r = r / 255.0
    
   hsi_lwpImg = rgb_lwpImg.copy()
    
   H, S, I = cv2.split(hsi_lwpImg)
    
   for i in range(rows):
    
     for j in range(cols):
    
       num = 0.5 * ((r[i, j]-g[i, j])+(r[i, j]-b[i, j]))
    
       den = np.sqrt((r[i, j]-g[i, j])**2+(r[i, j]-b[i, j])*(g[i, j]-b[i, j]))
    
       theta = float(np.arccos(num/den))
    
  
    
       if den == 0:
    
       H = 0
    
       elif b[i, j] <= g[i, j]:
    
     H = theta
    
       else:
    
     H = 2*3.14169265 - theta
    
  
    
       min_RGB = min(min(b[i, j], g[i, j]), r[i, j])
    
       sum = b[i, j]+g[i, j]+r[i, j]
    
       if sum == 0:
    
     S = 0
    
       else:
    
     S = 1 - 3*min_RGB/sum
    
  
    
       H = H/(2*3.14159265)
    
       I = sum/3.0
    
       # 输出HSI图像,扩充到255以方便显示,一般H分量在[0,2pi]之间,S和I在[0,1]之间
    
       hsi_lwpImg[i, j, 0] = H*255
    
       hsi_lwpImg[i, j, 1] = S*255
    
       hsi_lwpImg[i, j, 2] = I*255
    
   return hsi_lwpImg
    
 if __name__ == '__main__':
    
   rgb_lwpImg = cv2.imread("C:/Users/86199/Pictures/lena/lena.jpg")
    
   hsi_lwpImg = rgbtohsi(rgb_lwpImg)
    
   cv2.imshow('lena.jpg', rgb_lwpImg)
    
   cv2.imshow('hsi_lwpImg', hsi_lwpImg)
    
   key = cv2.waitKey(0) & 0xFF
    
   if key == ord('q'):
    
     cv2.destroyAllWindows()

3.运行结果

全部评论 (0)

还没有任何评论哟~