【OpenCV】1 图像基础知识

1 读入、显示、保存图像

#导入opencv的python版本依赖库cv2
import cv2
import matplotlib.pyplot as plt

1.1 读入图像 cv2.imread(path,flags)

img = cv2.imread('split.jpg', 1) 
# 0代表灰度图形式打开,1代表彩色形式打,彩色的通道为BGR
# type = numpy.ndarray,  img.shape:(height, width, channles)
                               

1.2 显示图像 cv2.imshow(‘winname’, img)

补充: 在cv2.imshow()前使用namedWindow可以指定窗口类型
函数: cv2.namedWindow(‘img’, cv2.WINDOW_AUTOSIZE)
参数: 参数1:输入图像; 参数二:窗口的标识,默认为WINDOW_AUTOSIZE;

  • cv2.WINDOW_AUTOSIZE 窗口大小自动适应图片大小,并且不可手动更改。
  • cv2.WINDOW_NORMAL 用户可以改变这个窗口大小
  • cv2.WINDOW_OPENGL 窗口创建的时候会支持OpenGL
cv2.namedWindow('img', cv2.WINDOW_AUTOSIZE) 
cv2.imshow('img', img) # 参数1:显示窗口的名字;参数2:显示的图像
#====以下控制窗口开关======#
k = cv2.waitKey(0)
if k == 27:   # 输入ESC键退出
    cv2.destroyAllWindows()
elif k == ord('s'): # 输入S键保存图片并退出
    cv2.imwrite('split_.jpg',img)
cv2.destroyAllWindows()
#=======================#

# 使用plt画图, plt.imshow()
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
#plt.xticks([]), plt.yticks([])   隐藏X、Y轴上的刻度
plt.show()

1.3 保存图像cv2.imwrite(path, img)

cv2.imwrite(path, img)  # 参数1:保存的路径;参数2:需保存的图像

2 通道转换

2.1 三通道变单通道灰度图

cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#导入opencv
import cv2 
#读入原始图像,使用cv2.IMREAD_UNCHANGED
img = cv2.imread("girl.jpg",cv2.IMREAD_UNCHANGED)
#查看打印图像的shape
shape = img.shape
#判断通道数是否为3通道或4通道,判断是否为彩色图
if shape[2] == 3 or shape[2] == 4 :
    #将BGR彩色图转化为单通道灰度图
    img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    cv2.imshow("gray_image",img_gray)
cv2.imshow("image", img)
cv2.waitKey(1000)   # 等待时间,1秒后关闭imshow窗口
cv2.destroyAllWindows()

2.2 单通道变三通道灰度图

cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

#导入opencv
import cv2 
#读入灰度图
img = cv2.imread("girl_gray.jpg",cv2.IMREAD_UNCHANGED)
#查看打印图像的shape
shape = img.shape 
img_color = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
cv2.imshow("color_image",img_color)
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.3 通道分离 cv2.split(img)

下面的程序将使用opencv加载一张彩色图,然后将其R、G、B三通道分离并显示

#加载opencv
import cv2
src=cv2.imread('split.jpg')
cv2.imshow('before',src)
#调用通道分离
b,g,r=cv2.split(src)
#三通道分别显示,因为是单通道图像,因此显示仍然为灰度图
cv2.imshow('blue',b),
cv2.imshow('green',g)
cv2.imshow('red',r)
cv2.waitKey(0)
cv2.destroyAllWindows()
#导入opencv模块
import numpy as np
import cv2            
 
image=cv2.imread("split.jpg")#读取要处理的图片
cv2.imshow("src",image)
cv2.waitKey(0)
B,G,R = cv2.split(image)#分离出图片的B,R,G颜色通道,B.shape= [height, width, 1]

zeros = np.zeros(image.shape[:2],dtype="uint8")#创建与image相同大小的零矩阵
cv2.imshow("BLUE",cv2.merge([B,zeros,zeros]))#显示 (B,0,0)图像,显示B通道图像
cv2.imshow("GREEN",cv2.merge([zeros,G,zeros]))#显示(0,G,0)图像
cv2.imshow("RED",cv2.merge([zeros,zeros,R]))#显示(0,0,R)图像
cv2.waitKey(0)
cv2.destroyAllWindows()

2.4图像通道合并cv2.merge([r,g,b])

#加载opencv
import cv2
img=cv2.imread('split.jpg')
cv2.imshow('before',img)
#调用通道分离
b,g,r=cv2.split(img)
#将Blue通道数值修改为0
g[:] = 0
#合并修改后的通道
img_merge=cv2.merge([b,g,r])
cv2.imshow('merge',img_merge)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.5 通道分离与合并小结cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

import cv2 
import numpy as np
img=cv2.imread('split.jpg')
#cv.namedWindow('before',cv.WINDOW_NORMAL)
cv2.imshow('before',img)
cv2.waitKey(0)
#通道分离
b,g,r=cv2.split(img)
cv2.imshow('blue',b);cv2.imshow('green',g);cv2.imshow('red',r)
cv2.waitKey(0)
#通道合并
src=cv2.merge([b,g,r])
cv2.imshow('merge',src)
cv2.waitKey(0)
# 修改某个通道
src[:,:,2]=100
cv2.imshow('single',src)
cv2.waitKey(0)
cv2.destroyAllWindows()

3 RGB与BGR转换

import cv2 
import matplotlib.pyplot as plt 
img = cv2.imread("test2.png", cv2.IMREAD_COLOR)
cv2.imshow("Opencv_win", img)
# 用opencv自带的方法转,opencv一般加载的都是BGR图片,因此要先转为RGB
img_cv_method = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 用numpy转,img[:,:,::-1]列左右翻转 
# img_numpy_method = img[:,:,::-1] # 本来是BGR 现在逆序,变成RGB

# 用matplot画图
plt.subplot(1,3,1);plt.imshow(img_cv_method)
plt.subplot(1,3,2);plt.imshow(img_numpy_method)
plt.subplot(1,3,3);plt.imshow(img)
plt.savefig("./plt.png")
plt.show()
#保存图片
cv2.imwrite("opencv.png", img)
cv2.waitKey(0); cv2.destroyAllWindows()

4 RGB与HSV转换cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

import cv2
#色彩空间转换函数
def color_space_demo(image):
    gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    cv2.imshow('gray',gray)
    hsv=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
    #print(hsv)
    cv2.imshow('hsv',hsv)
#读入一张彩色图
src=cv2.imread('girl.jpg')
cv2.imshow('before',src)
#调用color_space_demo函数进行色彩空间转化
color_space_demo(src)
cv2.waitKey(0); cv2.destroyAllWindows()

5 直方图绘制

5.1 方法1

#加载第三方库
import matplotlib.pyplot as plt
import cv2

girl = cv2.imread("girl.jpg")
cv2.imshow("girl", girl)
# girl.ravel()函数是将图像的三位数组降到一维上去,ravel()类似于Flatten
#256为bins的数目,[0, 256]为范围, 
plt.hist(girl.ravel(), 256, [0, 256])
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

5.2 方法2

import matplotlib.pyplot as plt
import cv2
import numpy as np
img = cv2.imread('girl.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

plt.imshow(img_gray, cmap=plt.cm.gray)
hist = cv2.calcHist([img], [0], None, [256], [0, 256])  
# 画直方图images, channels,mask,histsize, ranges(灰度范围)
#mask:掩膜,是一个大小和image一样的np数组,其中把需要处理的部分指定为1,不需要处理的部分指定为0,一般设置为None,表示处理整幅图像
#mask = np.zeros(img.shape[:2], np.uint8)
#mask[100:300, 100:400] = 255

plt.figure()
plt.title("Grayscale Histogram")
plt.xlabel("Bins");plt.ylabel("# of Pixels")
plt.plot(hist)
plt.xlim([0, 256])
plt.show()

5.3 三通道直方图绘制from matplotlib import pyplot as plt

import cv2
girl = cv2.imread("girl.jpg")
cv2.imshow("girl", girl)
color = ("b", "g", "r")
#使用for循环遍历color列表,enumerate枚举返回索引和值
for i, color in enumerate(color):
    hist = cv2.calcHist([girl], [i], None, [256], [0, 256])
    plt.title("girl")
    plt.xlabel("Bins")
    plt.ylabel("num of perlex")
    plt.plot(hist, color = color)
    plt.xlim([0, 260])
plt.show()
cv2.waitKey(0);cv2.destroyAllWindows()

猜你喜欢

转载自blog.csdn.net/weixin_44994302/article/details/121128965