1、读入图像

函数:cv2.imread(读取路径,读取方式)
常见的读取方式有三种

读取方式

含义

数字表示

cv2.IMREAD_COLOR

默认值,加载一张彩色图片,忽视透明度

1

cv2.IMREAD_GRAYSCALE

加载一张灰度图

0

cv2.IMREAD_UNCHANGED

按照图片的原始方式加载图像,包括它的Alpha通道

-1

import cv2
img=cv2.imread('test.jpg',0)
print(img.shape)

2、显示图像

函数:cv2.imshow(窗口名字,图像数据的名字)

img=cv2.imread('test.jpg',1)
cv2.imshow('image',img)

3、保存图片

函数:cv2.imwrite(图像名,待写入图片的数据变量名)

cv2.imwrite('new_img.jpg',img)

4、灰度转化

作用:将三通道图像(彩色图)转化为单通道图像(灰度图);可以在读取图片时将cv2.imread的参数设置为0或1来实现,采用下述方法可以了解转化的过程

公式:三通道转化为单通道:GRAY=B*0.114+G*0.587+R*0.229

           单通道转化为三通道:R=G=B=GRAY;A=0

函数:cv2.cvtColor(img,flag)

img为要转化的图像;flag为转换模式,flag=cv2.COLOR_BGR2GRAY时表示将彩色图图转化为灰度图;flag=cv2.COLOR_GRAY2BGR时表示将灰度图转化为彩色图

import cv2
img=cv2.imread("test.jpg",cv2.IMREAD_UNCHANGED)
shape=img.shape
print(shape)
#判断通道数是否为三通道或四通道
if shape[2]==3 or shape[2]==4:
    #彩色图转为灰度图
    img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    cv2.imshow("gray",img_gray)2
cv2.imshow("image",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

5、BGR与RGB的转化

opencv中读取图片默认方式为BGR,但在使用中常用RGB,因此根据需求有时需要对读取到的图片进行转化,转化方式有两种

1、用opencv自带的函数:cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

2、用numpy转,将原来的数据逆转

import cv2
import matplotlib.pyplot as plt
img=cv2.imread("test.jpg",1)
#用opencv自带的方法
img_cv_method=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#用numpy转,将列左右翻转
img_numpy_method=img[:,:,::-1]
#用matplot画图
plt.subplot(1,2,1)
plt.imshow(img_cv_method)
plt.subplot(1,2,2)
plt.imshow(img_numpy_method)
plt.savefig("./plt.png")
plt.show()
#保存图片
cv2.imwrite("opencv.png",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

6、通道的分离与合并

1、通道分离

目的:将彩色图像分成b,g,r3个单通道图像,方便对每个通道进行单独操作

函数:cv2.split(img)

2、通道合并

目的:对单通道进行修改以后,再将修改后的三个通道合并为彩色图像

函数:cv2.merge(list);待合并的通道数以list的形式输入

import cv2
img=cv2.imread("test.jpg")
#调用通道分离函数
b,g,r=cv2.split(img)
#三个通道分别显示
cv2.imshow('blue',b)
cv2.imshow('red',r)
cv2.imshow('green',g)
#将b通道变为0,查看与原图的区别
b[:] = 0
#合并通道
img_merge=cv2.merge([b,g,r])
cv2.imshow('merge',img_merge)
cv2.waitKey(0)
cv2.destroyAllWindows()

通过上述代码可以发现,单通道显示的每个图片都是灰度图,并不是分别显示为红、蓝、绿,因此若想让分离后B通道的图片呈蓝色,则需要将单通道变为三通道显示,即[B,0,0]的形式

import cv2
import numpy as np
img=cv2.imread("test.jpg")
#调用通道分离函数
B,G,R=cv2.split(img)
#创建与图像大小相同的零矩阵
zeros=np.zeros(img.shape[:2],dtype="uint8")
#显示【B,0,0】
cv2.imshow("BLUE",cv2.merge([B,zeros,zeros]))
cv2.waitKey(0)
cv2.destroyAllWindows()

7、图像直方图的绘制

1、图像直方图:表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。在这种直方图中,横坐标左侧为纯黑、较暗的区域,右侧为较亮、纯白的区域。

2、目的:对图像像素的分布进行统计

3、函数:cv2.calcHist(img,channels,mask,histSizze,ranges)

      img:要进行统计的图像,要用中括号括起来

      channels:待计算的通道

      histSize:表示直方图分为多少份

      ranges:要统计的像素值的范围

from matplotlib import pyplot  as plt
img=cv2.imread('test.jpg')
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

hist=cv2.calcHist([img],[0],None,[256],[0,256])

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

java 图片单通道转三通道 opencv三通道转单通道_opencv