系列文章目录
关于OpenCV的一些图像处理函数
图象基本操作(读取、显示、通道提取、边界填充、融合、保存)
Retinex图像增强算法——SSR,MSR,MSRCR,MSRCP,autoMSRCR
前言
最近跑代码,需要图形可视化,就学习了一下opencv图像处理操作,简单总结了一下。
一、opencv读取图像、显示等操作
图像python读取的几种方式
基于python的图像读取方式:
基于PIL库的图像读取、保存和显示
基于opencv-python的图像读取、保存和显示
基于matplotlib的图像读取、保存和显示
基于scikit-image的图像读取、保存和显示
基于imageio的图像读取、保存和显示
安装相应的包
#用哪种方式安装相应的包就可以了
pip install pillow
pip install scikit-image
pip install matplotlib
pip install opencv-python
pip install numpy scipy scikit-learn
1.读取彩色、灰度图像
cv2.IMREAD_COLOR:彩色图像
cv2.IMREAD_GRAYSCALE:灰度图像
import cv2 as cv
#图像在根目录下
#image =cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE)
#想要读取图片的地址 默认彩色
image = cv2.imread("D:/code/picture processing/jupyter_code/data/319.jpg")
#读取灰度图像
#image =cv2.imread("D:/code/picture processing/jupyter_code/data/319.jpg",cv2.IMREAD_GRAYSCALE)
#读取彩色图像
#image =cv2.imread("D:/code/picture processing/jupyter_code/data/319.jpg",cv2.IMREAD_COLOR)
cv.imshow("img",image)
cv.waitKey(0)
如果报错:OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cp 一般是你的图片路径不对。我们可以尝试在路径里使用双斜杆“//”(绝对路径),反斜杠""(linux的路径)。别问我为什么知道,因为我掉过坑。如果不是请参考解决opencv中算术运算报错
2.图片显示
import cv2 #opencv读取的格式是BGR
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
img = cv2.imread("D:/code/picture processing/jupyter_code/data/319.jpg")
cv2.imshow('image',img)
# ()内为等待时间,毫秒级;如果输入0则表示任意键终止
cv2.waitKey(0)
cv2.destroyAllWindows()
1. 图像显示函数
import cv2 #opencv读取的格式是BGR
# 显示普通图片 numpy类型
def cv_show1(name, img): # 长宽高
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 显示标准化后图片 维度为 高 长 宽 tensor类型
def cv_show2(name,img): # 高 长 宽
img = img / 2 + 0.5 # unnormalize 反标准化
npimg = img.numpy() # 转numpy
cv_show(name, np.transpose(npimg, (1, 2, 0))) #转换维度
img = cv2.imread("D:/code/picture processing/jupyter_code/data/319.jpg")
cv_show1('image',img)
2.转化为灰度图
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 转换为灰度图
3.调整图片大小
img11 = cv.resize(img, (640, 640), interpolation=cv.INTER_AREA)#调整图片大小
3.保存图像
cv2.imwrite("1.jpg",img) #将图片保存为1.jpg
4.颜色通道提取、合并
b,g,r=cv2.split(img) # 提取
image= cv2.merge([b, g, r]) # 通道合并。
5.边界填充
BORDER_REPLICATE:复制法,也就是复制最边缘像素。
BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
BORDER_CONSTANT:常量法,常数值填充。
top_size,bottom_size,left_size,right_size = (50,50,50,50)
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)
6.图像融合
res = cv2.addWeighted(img1, 0.4, img2, 0.6, 0)
7.对图像数据进行简单拉伸
简述:将一组数据数组拉伸到0-255范围。
y = torch.load("myTensor20-1.pth") #读取数据
print(y.shape)
print(y.dtype)
a=0
b=255
new_arr = ((y - y.min()) * (a/(y.max() - y.min()) * b))
print(new_arr)
8.高斯函数
blur_image = cv2.GaussianBlur(img, (5, 5), 0)#(5, 5)表示高斯矩阵的长与宽都是5,标准差取0
cv2.GaussianBlur(src, ksize, sigmaX, sigmaY, borderType)
src:输入图像。
ksize:高斯内核大小。
sigmaX: X方向上的高斯核标准偏差。
sigmaY: Y方向上的高斯核标准差;
如果写sigmaX,sigmaY=0,则函数会自行计算。
经验上来讲,高斯核越大图片越模糊,标准差越大也一样越模糊。
这个我有一个问题,之前遇到了下面这种用法 ,卷积核为(0,0) 那么卷积核是函数根据图片数据自动计算了吗?
cv2.GaussianBlur(img, (0, 0), sigma)
9.图片乘、加、减
image = cv2.multiply(image1, image2) # 乘
image = cv2.subtract(image1, image2) # 减
image = cv2.add(image1, image2) # 加
subtract(src1, src2, dst=None, mask=None, dtype=None)
这三个用法大致类似。
参数说明:
src1:作为被减数的图像数组或一个标量
src2:作为减数的图像数组或一个标量
dst:可选参数,输出结果保存的变量,默认值为None,如果为非None,输出图像保存到dst对应实参中,其大小和通道数与输入图像相同,图像的深度(即图像像素的位数)由dtype参数或输入图像确
mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像数组的元素,即输出图像像素只有mask对应位置元素不为0的部分才输出,否则该位置像素的所有通道分量都设置为0
dtype:可选参数,输出图像数组的深度,即图像单个像素值的位数(如RGB用三个字节表示,则为24位)。
10.归一化函数
指定将图片的值放缩到 0-255 之间
array = cv2.normalize(src,None,0,255,cv2.NORM_MINMAX)
函数原型:
array = cv2.normalize(src,dst=None,alpha=0,beta=255,normType=cv2.NORM_MINMAX)
参数:
src :输入数组
dst:输出数组,支持原地运算
alpha:range normalization模式的最小值
beta:range normalization模式的最大值,不用于norm normalization(范数归一化)模式。
normType:
NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。
NORM_INF: 此类型的定义没有查到,根据opencv 1的对应项,可能是归一化数组的C-范数(绝对值的最大值)
NORM_L1 : 归一化数组的L1-范数(绝对值的和)
NORM_L2: 归一化数组的(欧几里德)L2-范数
11.cv2.convertScaleAbs()
函数按顺序执行四个操作。一通过因子alpha重新调整源图像,二通过加因子beta实现偏移,三计算上述所求和的绝对值,四将结果映射到一个无符号字符型(8位)。 相当于对图片像素点取y = ax + b 的操作 然后取绝对值 取整。
img = convertScaleAbs(src, dst, alpha=1.5, beta =10)
参数:
src: 输入数组
dst:输出数组
alpha: 乘数因子
beta :偏移量
二、opencv读取视频
vc = cv2.VideoCapture("./data/test.mp4")
# 检查是否打开正确
if vc.isOpened():
oepn, frame = vc.read()
else:
open = False
while open:
ret, frame = vc.read()
if frame is None:
break
if ret == True:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #变灰度图像
cv2.imshow('result', gray)
if cv2.waitKey(10) & 0xFF == 27:
break
vc.release()
cv2.destroyAllWindows()
三、python Image 模块读取保存图片
from PIL import Image
# Image.open()函数只是保持了图像被读取的状态
# 对需要操作图像每个元素,如输出某个像素的RGB值等,需要执行对象的load()方法读取数据
img=Image.open("D:/code/picture processing/jupyter_code/data/319.jpg") #读取一张图片
#img = img.load()
img.show() #显示一张图片
img.save("save.jpg") #保存图像
newImg = Image.new("RGBA",(640,480),(0,255,0)) #创建新图片
转换
# Image->cv2
img_array = np.array(img)
# cv2->Image
img_Image = Image.fromarray(np.uint8(img))
png转jpg
from PIL import Image
im = Image.open('test.png')
im = im.convert('RGB')
im.save('test.jpg', quality=95)
png转jpg其实也是一种图片压缩。save函数中quality参数指定图片质量,其取值范围是1~95,默认值是75。指定quality=95的时候,图片质量最好。
还有很多子函数 可参考这个链接http://t.csdn.cn/xln03。
四、matplotlib的python数据可视化
参考http://t.csdn.cn/mpRoZ
参考http://t.csdn.cn/HeRGZ
总结
应该还有其他的函数和操作,后期遇到了慢慢添加。