展示一个图片
import cv2
def main():
img=cv2.imread('1.jpg')#读
cv2.imshow('gray1',img)#窗口展示
cv2.imwrite('save.png',img)#保存
cv2.waitKey(0)#等待
if __name__ == '__main__':
main()
创建一个灰度图像
import numpy as np
import cv2
def main():
data=[[0,0,0],[0,0,0]]
img=np.array(data,dtype=np.uint8)
cv2.imwrite('img_cv2.jpg',img)
cv2.imshow('img_cv2.jpg',img)
cv2.waitKey(0)
if __name__ == '__main__':
main()
复制一个图像把它变成灰度图像
import numpy as np
import cv2
def main():
img = cv2.imread('1.jpg')
height,width,n=img.shape#得到图片的宽高和维度
img2=img.copy()#复制
for i in range(height):
for j in range(width):
img2[i,j]=0#置0,变为灰度图像
cv2.imshow('img2.jpg', img2)
cv2.waitKey(0)
if __name__ == '__main__':
main()
彩色图像通道分离、合并
import numpy as np
import cv2
from cv2 import COLOR_BGR2Lab
def main():
img = cv2.imread('1.jpg')
img2=cv2.cvtColor(img,COLOR_BGR2Lab)#固定颜色通道
r,g,b=cv2.split(img2)
cv2.imshow("Red",r)
cv2.imshow("Green", g)
cv2.imshow('Blue', b)
img3=cv2.merge([b,g,r])#合并
cv2.imshow('img3.jpg', img3)
cv2.waitKey(0)
if __name__ == '__main__':
main()
彩色图二值化
import numpy as np
import cv2
from cv2 import COLOR_BGR2Lab
def main():
img = cv2.imread('1.jpg',0)#0是灰度,1是高亮
#THRESH_BINARY_INV白大于黑 THRESH_BINARY黑大于白 THRESH_TRUNC比原图灰且微透明 THRESH_TOZERO模糊
thresh1,dst=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
#img输入图,dst输出图,127阈值
cv2.imshow('dst.jpg', dst)
cv2.waitKey(0)
if __name__ == '__main__':
main()
彩色图像转换为灰度图像有三种方法
其一:imread读取图像的时候直接设置参数为0
其二:调用cvtColor()函数,参数设置为cv2.COLOR_BGR2GRAY
其三:调用split()函数
图像的缩放
import numpy as np
import cv2
def main():
img = cv2.imread('1.jpg')
cv2.imshow('img.jpg', img)
height,width,n=img.shape#得到图片的宽高和维度
downscale=cv2.resize(img,(100,100),interpolation=cv2.INTER_LINEAR)#缩小
cv2.imshow('downscale.jpg', downscale)
upscale=cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_LINEAR)#放大
cv2.imshow('upscale.jpg', upscale)
#[1,0,500],[0,1,50]向左、向右各移动五十个像素
M=np.array([[1,0,500],[0,1,50]],np.float32)#图像平移
img_tr=cv2.warpAffine(img,M,img.shape[0:2])#mg.shape[:2]:图像尺寸
cv2.imshow('imgtr.jpg', img_tr)
#旋转
M2=cv2.getRotationMatrix2D((width/2,height/2),45,1)#旋转中心点、旋转角度、图像缩放因子
img_ro = cv2.warpAffine(img, M2, img.shape[0:2]) # mg.shape[:2]:图像尺寸
cv2.imshow('imgro.jpg', img_ro)
cv2.waitKey(0)
if __name__ == '__main__':
main()
dst=cv2.flip(src, flipCode ,dst=None)
src:输入图像
flipCode:翻转模式,filpCode==0垂直翻转,>0水平翻转(沿y轴),<0水平垂直翻转(先沿x轴,再沿y轴,等价于旋转180度)
绘制灰度图像直方图
import numpy as np
import cv2
from matplotlib import pyplot as plt
def main():
img = cv2.imread('1.jpg',0)#转为灰度图片
hist=cv2.calcHist([img],[0],None,[256],[0,256])
plt.figure()#新建一个图像
plt.title("灰度图像直方图")#图像的名字
plt.xlabel("Bins")#x轴
plt.ylabel("像素")#y轴
plt.plot(hist)#画图
plt.xlim([0,256])#设置x轴坐标的范围
plt.show()
input()
if __name__ == '__main__':
main()
所用函数:
hist=cv2.calcHist(images,channel,mask,histSize,range)
[img]:输入图像,要用[]括起来
[channel]:传入图像的通道,如果是灰度图像,那么只有一个通道,值为0;如果是彩色图像(有三个通道),那么在0,1,2中选一个值,对于BGR的各个通道。这个值也要用[]传入
mask:掩膜图像,如果统计整幅图,那么为None;如果要统计部分的直方图,就得构造相应的掩膜来计算
histSize:灰度的个数,需要[]
range:像素值的范围,通常为[0,256]。此外,如果channels的值为[0,1],range为[0,256,0,180],则代表0通道范围是0256,1的通道范围是0180
彩色直方图,展示像素分布
-*- coding: UTF-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
def main():
img = cv2.imread("1.jpg")
chans = cv2.split(img)#按将彩色图像分离为三个单通道的灰度图像
colors = ('b', 'g', 'r')
plt.figure()#新建一个图像
plt.title("Flattened Color Histogram")#图像的标签
plt.xlabel("Bins")#x轴
plt.ylabel("# of Pixels")#y轴
#遍历
for (chan, color) in zip(chans, colors):
hist = cv2.calcHist([chan], [0], None, [256], [0, 256])#根据通道计算图像直方图
plt.plot(hist, color=color)#画图
plt.xlim([0, 256])#设置x轴坐标范围
plt.show()#显示图像
input()
if __name__ == '__main__':
main()
直方图均衡化,用于提高图像的质量
-*- coding: UTF-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
def main():
img = cv2.imread("1.jpg",0)
eq = cv2.equalizeHist(img)#直方图均衡化,用于提高图像的质量
cv2.imshow("Histogram Equalization", np.hstack([img, eq]))
cv2.waitKey(0)
if __name__ == '__main__':
main()
equalize 函数实现的灰度直方图均衡化算法,就是把直方图的每个灰度值进行归一化处理,
求每种灰度的累积分布,接着得到一个映射的灰度映射表,然后根据相应的灰度值来修正原图中的每个像素。
void equalize(InputArray src, OutputArray dst);
src,输入图像,即源图像,填 Mat 类的对象即可,但需要为 8 位单通道的图像。
dst,输出结果,需要和源图像有一样的尺寸和类型。
局部直方图均衡化
# -*- coding: UTF-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
def main():
img = cv2.imread("1.jpg",0)
clahe = cv2.createCLAHE(5, (8, 8))#创造一个8*8的clash
dst = clahe.apply(img)#图片切分成8*8的小块
cv2.imshow("local Histogram Equalization", np.hstack([img, dst]))#两张图片进行对比
# 显示img直方图
hist0 = cv2.calcHist([img], [0], None, [256], [0, 256])
plt.figure() # 新建一个图像
plt.title("img灰度图像直方图") # 图像的名字
plt.xlabel("Bins") # x轴
plt.ylabel("像素") # y轴
plt.plot(hist0) # 画图
plt.xlim([0, 256]) # 设置x轴坐标的范围
plt.show()
#显示dst直方图
hist = cv2.calcHist([dst], [0], None, [256], [0, 256])
plt.figure()#新建一个图像
plt.title("dst灰度图像直方图")#图像的名字
plt.xlabel("Bins")#x轴
plt.ylabel("像素")#y轴
plt.plot(hist)#画图
plt.xlim([0,256])#设置x轴坐标的范围
plt.show()
input()
cv2.waitKey(0)
if __name__ == '__main__':
main()
cv2.createCLAHE([, clipLimit[, tileGridSize]])
dst=retval.apply(src)
参数含义:
clipLimit:对比对限制阈值,默认为40;
tileGridSize:直方图均衡的栅格尺寸,输入图像将会按照该尺寸分隔后进行局部直方图均衡,默认是8×8大小;
src:输入图像,8bit单通道;
dst:均衡后的输出图像,类型同src;
图像方向投影
-*- coding: UTF-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
def main():
sample = cv2.imread("50.jpg")
target = cv2.imread("5.jpg")
roi_hsv = cv2.cvtColor(sample, cv2.COLOR_BGR2HSV)#转化成hsv空间
target_hsv = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)
cv2.namedWindow("sample", cv2.WINDOW_NORMAL)#namedWindow:建一个显示窗口。
cv2.imshow("sample", sample)
cv2.namedWindow("target", cv2.WINDOW_NORMAL)
cv2.imshow("target", target)
roiHist = cv2.calcHist([roi_hsv], [0, 1], None, [32, 30], [0, 180, 0, 256]) # 计算样本直方图 [32, 30]越小,效果越好
cv2.normalize(roiHist, roiHist, 0, 255, cv2.NORM_MINMAX) # 规划到0-255之间
dst = cv2.calcBackProject([target_hsv], [0, 1], roiHist, [0, 180, 0, 256], 1) # 计算反向投影
cv2.namedWindow("back_projection_demo", cv2.WINDOW_NORMAL)
cv2.imshow("back_projection_demo", dst)
cv2.waitKey(0)
if __name__ == '__main__':
main()