OpenCV程序练习(二):图像处理基础

一、彩色图像像素处理

代码

import cv2
import numpy as np
#----------蓝色通道----------
blue=np.zeros((300,300,3),dtype=np.uint8)
blue[:,:,0]=255
print("blue=\n",blue)
cv2.imshow("blue",blue)
#----------绿色通道----------
green=np.zeros((300,300,3),dtype=np.uint8)
green[:,:,1]=255
print("green=\n",green)
cv2.imshow("green",green)
#----------红色通道----------
red=np.zeros((300,300,3),dtype=np.uint8)
red[:,:,2]=255
print("red=\n",red)
cv2.imshow("red",red)
#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

程序分析

● 针对数组blue,将其第0个通道的值设置为255。从图像角度来 看,图像blue的B通道值为255,其余两个通道值为0,因此图像blue为蓝色图像。
同理,数组green的第1个通道(图像green的G通道)值为255,数组red的第1个通道(图像red的R通道)值为255。
● 从通道值设置可以看出,在OpenCV中,通道的顺序是 B→G→R 

 

二、生成像素值为随机数的图像

1、灰度图像

代码

import cv2
import numpy as np
img=np.random.randint(0,256,size=[256,256],dtype=np.uint8)
cv2.imshow("Grayscale",img)
#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

2、彩色图像

代码

import cv2
import numpy as np
img=np.random.randint(0,256,size=[256,256,3],dtype=np.uint8)
cv2.imshow("Colorscale",img)
#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

3、程序分析

随机灰度图像和随机彩色图像差别仅在size:随机灰度图像的size=[256,256],随机彩色图像的size=[256,256,3]

区别在于随机彩色图像必随机灰度图像多了两个通道数,随机灰度图像的size也可写为size=[256,256,1]

 

三、使用numpy.array访问彩色图像像素

代码

import cv2
import numpy as np

img=cv2.imread("demoimg.jpg")
cv2.imshow("before",img)

#使用item()函数读取原图像第0行第0列位置上的 B通道、G通道、R通道三个通道上的像素值
print("修改前:")
print("(0,0,0)=",img.item(0,0,0))
print("(0,0,1)=",img.item(0,0,1))
print("(0,0,2)=",img.item(0,0,2))

#使用嵌套循环语句将位于“第0行到第49行”和“第0列到第99列”的交叉区域内的像素值赋予随机值
for i in range(0,50):
    for j in range(0,100):
        for k in range(0,3):
            img.itemset((i,j,k),np.random.randint(0,256,dtype=np.uint8))  #使用itemset()函数对像素进行修改
cv2.imshow("after",img)

#使用item()函数读取修改后图像第0行第0列位置上的 B通道、G通道、R通道三个通道上的像素值
print("修改后:")
print("(0,0,0)=",img.item(0,0,0))
print("(0,0,1)=",img.item(0,0,1))
print("(0,0,2)=",img.item(0,0,2))

#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

  

 

四、感兴趣区域(ROI)

1、获取ROI

代码

import cv2

img=cv2.imread("demoimg.jpg")
roi=img[170:220,110:160]    #获取ROI
cv2.imshow("original image",img)    #显示原始图像
cv2.imshow("ROI",roi)   #显示ROI

#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

  

2、对ROI打码

代码

import cv2
import numpy as np

img=cv2.imread("demoimg.jpg",cv2.IMREAD_UNCHANGED)  #读取图像,读取标记值cv2.IMREAD_UNCHANGED为保持原格式不变
cv2.imshow("original image",img)    #显示原始图像
img[170:220,110:160]=np.random.randint(0,256,(50,50,3)) #将原图像的ROI用随机图像替换
cv2.imshow("result",img)   #显示替换后图像

#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

  

 

五、通道操作 

1、通道拆分

代码

import cv2

img=cv2.imread("colorimg.jpg")  #读取图像
cv2.imshow("original image",img)    #显示原图像
#分别拆分B、G、R三个通道
b,g,r=cv2.split(img)  
"""
使用函数cv2.split()拆分图像通道,等价于:
b=img[:,:,0]
g=img[:,:,1]
r=img[:,:,2]
"""
#分别显示单独拆分出B、G、R三个通道的图像
cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)
#B通道设为0
img[:,:,0]=0
cv2.imshow("B0",img)
#G通道设为0,此时原图像的B和G通道值都为0,仅R通道有值
img[:,:,1]=0
cv2.imshow("B0G0",img)

#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

程序分析

  • 从运行结果看出,单独拆分出的通道其对应的颜色会偏白,与其相对的颜色则偏黑
  • 将指定通道值设为0后,该通道的颜色偏黑

2、通道合并

代码

import cv2

img=cv2.imread("colorimg.jpg")  #读取图像
cv2.imshow("original image",img)    #显示原图像
b,g,r=cv2.split(img)    #分别拆分B、G、R三个通道
#分别按照B→G→R和R→G→B顺序合并通道
bgr=cv2.merge([b,g,r])
rgb=cv2.merge([r,g,b])
#分别显示按照B→G→R和R→G→B顺序合并通道后的图像
cv2.imshow("BGR",bgr)
cv2.imshow("RGB",rgb)

#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

 

程序分析

从运行结果可以看出,改变通道顺序后,图像显示效果会发生变化,从纯颜色角度看,其余对应的颜色相互颠倒,但R→G→B顺序的通道红色部分相对原图偏暗。

 

posted @ 2022-08-13 15:27  香菜大魔法师  阅读(81)  评论(0编辑  收藏  举报