# Homework **Repository Path**: bethvenous/AI-Homework ## Basic Information - **Project Name**: Homework - **Description**: Store the homework for testing - **Primary Language**: Python - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2019-02-27 - **Last Updated**: 2021-01-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 第一周作业 - Python&opencv显示彩色图片的HSV 、BGR分量图的程序 #### 作业描述 使用Python&Opencv读取图片,并通过函数cvtColor()和Split()分离图片不同通道并使用matplotlib坐标显示对比图 #### 软件架构 编程语言:Python 3.6.6 模块:OpenCV 4.0.0,OS,Matplotlib #### 结果预览 ![HSV分量通道图](https://images.gitee.com/uploads/images/2019/0301/115045_570b1b0a_4836253.png "Screen Shot 2019-03-01 at 11.48.08 AM.png") ![BGR分量通道图](https://images.gitee.com/uploads/images/2019/0301/115127_c22c382d_4836253.png "Screen Shot 2019-03-01 at 11.48.38 AM.png") #### 程序实现 1. 判断图片路径是否存在,如果存在导入图片 ``` #get the absolut image path #eg. can try opencv-logo2.png for testing imgPath = os.path.abspath("week1/opencv-logo2.png") #verify the path is file or not if os.path.isfile(imgPath): #read the image image1 = cv2.imread(imgPath) ``` 2. 实现图片HSV通道分离 ``` #splitting an RGB image to H,S,V channels imageSplitHSV = cv2.cvtColor(image1, cv2.COLOR_BGR2HSV) #get the HSV image h, s, v = cv2.split(imageSplitHSV) ``` 3. 显示原始图以及分离后的通道图,使用matplotlib请注意其显示方式为RGB颜色,而opencv图片显示方式为BGR,所以在最终imshow一定要进行图片颜色转化cv2.cvtColor(image1, cv2.COLOR_BGR2RGB) ``` #matplotlib show the image as RGB, but cv2 show the image as BGR, so need to correct the channels, before display plt.subplot(221), plt.axis("off"), plt.imshow(cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)), plt.title('Original Image') plt.subplot(222), plt.axis("off"), plt.imshow(cv2.cvtColor(h, cv2.COLOR_BGR2RGB)), plt.title('Hue') plt.subplot(223), plt.axis("off"), plt.imshow(cv2.cvtColor(s, cv2.COLOR_BGR2RGB)), plt.title('Saturation') plt.subplot(224), plt.axis("off"), plt.imshow(cv2.cvtColor(v, cv2.COLOR_BGR2RGB)), plt.title('Value') plt.show() ``` 4. 图片一直停留窗口 ``` cv2.waitKey(0) ``` 5. 实现图片BGR通道分离 ``` #splitting an RGB image to R,G,B channels - python #cv2.split函数分离得到各个通道的灰度值(单通道图像) b, g, r = cv2.split(image1) ``` 如图所示,将BGR颜色分量提取后,显示的结果将会是以该颜色的灰度图,例如红色分量,由于原始图片为三原色,红色越亮,就显示为白色,同理绿色分量和蓝色分量部分,绿色和蓝色也会在单通道颜色中显示为白色。 ![BGR分量通道图](https://images.gitee.com/uploads/images/2019/0301/115127_c22c382d_4836253.png "Screen Shot 2019-03-01 at 11.48.38 AM.png") 6. 显示原始图以及分离后的B、G、R单通道图 ``` plt.subplot(221), plt.axis("off"), plt.imshow(cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)), plt.title('Original Image') plt.subplot(222), plt.axis("off"), plt.imshow(cv2.cvtColor(b, cv2.COLOR_BGR2RGB)), plt.title('Blue') plt.subplot(223), plt.axis("off"), plt.imshow(cv2.cvtColor(g, cv2.COLOR_BGR2RGB)), plt.title('Green') plt.subplot(224), plt.axis("off"), plt.imshow(cv2.cvtColor(r, cv2.COLOR_BGR2RGB)), plt.title('Red') plt.show() ``` 7.图片一直停留窗口,直到点击任何键,程序结束,销毁窗口 ``` cv2.waitKey(0) cv2.destroyAllWindows() ``` #### 思考: 为什么RGB通道分离只显示灰色图而不是彩色图? #cv2.split函数分离得到各个通道的灰度值(单通道图像),可以通过cv2.merge进行通道扩展 #cv2.merge函数是合并单通道成多通道(不能合并多个多通道图像) #分别扩展B、G、R成为三通道。另外两个通道用上面的值为0的数组填充 #### 程序验证 ``` # 生成一个值为0的单通道数组 zeros = np.zeros(image1.shape[:2], dtype = "uint8") #cv2.merge函数是合并单通道成多通道(不能合并多个多通道图像) #分别扩展B、G、R成为三通道。另外两个通道用上面的值为0的数组填充 cv2.imshow("Blue", cv2.merge([b, zeros, zeros])) cv2.imshow("Green", cv2.merge([zeros, g, zeros])) cv2.imshow("Red", cv2.merge([zeros, zeros, r])) ```