使用imread()函数读取一张图片。
使用 imshow()函数显示图片。
使用函数 waitKey(0)使显示图片窗口停留。
import cv2
img = cv2.imread("road.jpg",cv2.IMREAD_COLOR)#img = cv2.imread("road.jpg",1)
cv2.imshow("image",img)
cv2.waitKey(0)
cv2.destoryAllWindows()
使用cv2.imwrite()函数存储图片到指定位置。返回布尔类型。
cv2.imwrite(filename,image)
filename:字符串表示图片名字,需要包含后缀.jpg,.png等等
image:要被保存的图片
return value:图片保存成果返回true
#图片路径
image_path = r'C:\\Users\\dell\\PycharmProjects\\learnOpencv\\add_s.jpg'
directory = r'C:\\Users\\dell\\PycharmProjects\\learnOpencv'
#读取并加载图片
img = cv2.imread(image_path)
os.chdir(directory) #切换保存空间
print("before saving image:")
print(os.listdir(directory))
#写入并保存图片
filename = 'savedImage.png'
cv2.imwrite(filename,img)
print("after saving iamge:")
print(os.listdir(directory))
print('sucessfully saved')
# 读入图片
image = cv2.imread('RGB_paint.png')
B, G, R = cv2.split(image) #将三个色彩通道分开
cv2.imshow("original",image)
cv2.waitKey(0)
#分别显示三通道颜色
cv2.imshow("blue", B)
cv2.waitKey(0)
cv2.imshow("Green", G)
cv2.waitKey(0)
cv2.imshow("red", R)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.bitwise_and(scr1, scr2, destination, mask) 计算两个图片像素按位与:dest = scr1 & scr2
cv2.bitwise_or(scr1,scr2,destination, mask) 按位或计算两个图片的值
cv2.bitwise_xor(scr1,scr2,destination,mask) 按位异或计算两个图片的值
dest_and = cv2.bitwise_not(image1, image2) 按位否
scr1:第一个输入图片数组
scr2:第二个输入图片数组
dest:输出图片数组
mask:操作规则
image1 = cv2.imread('img.png')
print(image1.shape) # (250, 499, 3)
cv2.imshow('image1',image1)
cv2.waitKey(0)
image2 = cv2.imread('img_1.png')
print(image2.shape) # (250, 499, 3)
cv2.imshow('image2', image2)
cv2.waitKey(0)
# 像素值按位与操作
dest_and = cv2.bitwise_and(image1,image2)
cv2.imshow('Bitwise_and',dest_and)
cv2.waitKey(0)
cv2.destroyAllWindows()
dest_or = cv2.bitwise_or(image1, image2)
cv2.imshow('Bitwise_or', dest_or)
cv2.waitKey(0)
cv2.destroyAllWindows()
dest_xor = cv2.bitwise_xor(image1, image2)
cv2.imshow('Bitwise_xor', dest_xor)
cv2.waitKey(0)
cv2.destroyAllWindows()
dest_not = cv2.bitwise_not(image1, image2)
cv2.imshow('Bitwise_not', dest_not)
cv2.waitKey(0)
cv2.destroyAllWindows()
调整大小插值方法:
cv2.INTER_AREA:缩小图片
cv2.INTER_CUBIC:双三次插值
cv2.INTER_LINEAR:opencv默认的插值技术,线性插值
cv2.resize(src, dst, dst.size(), 0, 0, interpolation))
src:源图片
dst:默认值为None
dst.size():输出图片的大小
fx,fy:水平垂直方向放缩倍数
interpolation:插值方法
image = cv2.imread("add_s.jpg")
print(image.shape) #(250, 500, 3)
half = cv2.resize(image,(0,0),fx= 0.1,fy=0.1) # (25, 50, 3)
bigger = cv2.resize(image,(1050,1610)) #(1610, 1050, 3)
stretch_near = cv2.resize(image,(780,540),interpolation=cv2.INTER_NEAREST) #(540, 780, 3)
Titles = ["original","Half","Bigger","Interpolation Nearest"]
images = [image, half, bigger,stretch_near]
count = 4
for i in range(count):
plt.subplot(2,2,i+1)
plt.title(Titles[i])
plt.imshow(images[i])
print(images[i].shape)
plt.show()
cv2.erode(src,kernal,dst=None,anchor,iterations)
src:源图片
kernal:用于侵蚀的结构元素,如果是个矩阵则使用$3 \times 3$的矩形结构元素
dst:输出图片
iterations:迭代次数,用于侵蚀的次数
返回值:返回一个图像
image = cv2.imread("add_s.jpg")
window_name = "Image"
#创建一个kernal内核,uint类型的5 x 5 的矩阵
kernal = np.ones((5,5),np.uint8)
#侵蚀函数, src, kernal
image_erode = cv2.erode(image,kernal)
cv2.imshow(window_name,image_erode)
cv2.waitKey(0)
cv2.destroyAllWindows()
定义:模糊图片
优点:1、去噪,噪声被认为是high pass signal 2、使图片变得光滑 3、低亮度的边界被去除 4、必要时隐藏具体细节
重要的模糊类型:
高斯模糊:高斯函数作用下的模糊图像,常用在图片去噪,减少细节,常作为模型输入的预处理阶段,
cv2.GaussianBlur(src, ksize,sigmax,) ksize:高斯核shape,一般是奇数正数,sigmax:水平方向的高斯标准差
中间模糊:非线性的数字过滤技术,保存边界同时去噪,是消除噪声的常用算法
cv2.medianBlur(src,ksize,dst=None):ksize必须是大于1的奇数。使图片光滑的模糊。
双边模糊:是一个非线性的、保存边界的、去噪的光滑的图片模糊过滤器,使用附近光强权重替换特定像素点的光强,权重可以是高斯分布,尖锐的边界被保存同时丢弃弱的那个。可以去除噪声同时保留边界。
bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
d:过滤期间每个像素邻域的直径
sigmaColor:颜色空间的过滤参数,越大意味着像素领域越远的颜色会混合在一起。
sigmaSpace:坐标空间过滤sigma,越大意味着相近颜色足够远也能相互影响
image = cv2.imread("add_s.jpg")
cv2.imshow("original",image)
cv2.waitKey(0)
#cv2.GaussianBlur(src, ksize,sigmax,) ksize:高斯核shape,一般是奇数正数,sigmax:水平方向的高斯标准差
Gaussian = cv2.GaussianBlur(image,(7,7),0)
cv2.imshow("Gaussian Bluring",Gaussian)
cv2.waitKey(0)
# cv2.medianBlur(src,ksize,dst=None):ksize必须是大于1的奇数。使图片光滑的模糊。
median = cv2.medianBlur(image,5)
cv2.imshow("median Blur", median)
cv2.waitKey(0)
# cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
bilaternal = cv2.bilateralFilter(image,9,75,75)
cv2.imshow("bilaternal Blur", bilaternal)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.copyMakeborder(src, top, bottom, left,right, borderType, value)
top:顶部像素的边框宽度
bottom:底部像素的边框宽度
borderType:描述了要添加什么样的边框:
cv2.BORDER_CONSTANT:添加恒定的彩色边框,值需要value参数给出。
cv2.BORDER_REFLECT:边界是边界元素的镜像表示,cv2.BORDER_REFLECT_101或cv2.BORDER_REFLECT_DEFAULT
cv2.BORDER_REPLICATE:(复制):复制最后一个元素,
image = cv2.imread("add_s.jpg")
Window_name = 'Image'
image = cv2.copyMakeBorder(image,10,10,10,10,cv2.BORDER_CONSTANT,value=0)
cv2.imshow(Window_name,image)
cv2.waitKey(0)
image_1 = cv2.copyMakeBorder(image,100,100,50,50,cv2.BORDER_REPLICATE)
Window_name1 = 'Image_reflect'
cv2.imshow(Window_name1,image_1)
cv2.waitKey(0)
image_2 = cv2.copyMakeBorder(image, 100, 100, 50, 50, cv2.BORDER_REPLICATE)
Window_name2 = 'Image_replicate'
cv2.imshow(Window_name2, image_2)
cv2.waitKey(0)
cv2.destroyAllWindows()
灰度转变优点:降维,减小模型复杂度。
方法一:cv2.cvtColor():使用这个函数将图片转变为灰度图。cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
方法二、cv2.imread(path,flags=0):将图片转为灰度图
方法三、使用像素操作
# 图片读入时使用flags = 0将图片转化为灰度图
image = cv2.imread("add_s.jpg",flags=0)
cv2.imshow("original",image)
cv2.waitKey(0)
# cvtCOLOR()函数将图片转化为灰度图
gray_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow("gray",gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
def main():
# imread函数读取一张图片
image = cv2.imread("road.jpg")
print(type(image))
print(image.shape)
# 提取图片的高和宽
h,w,c = image.shape[:]
print("Height = {}, width = {}, channel = {}".format(h,w,c))
(B,G,R) = image[100,100]
print("R = {}, G = {}, B = {}".format(R,G,B))
B = image[100, 100, 0]
print("B = {}".format(B))
# 指定大小
resize = cv2.resize(image,(800,800))
cv2.imshow("imageResize",resize)
cv2.waitKey(0)
# 旋转图片
center = (w // 2, h // 2)
matrix = cv2.getRotationMatrix2D(center, -45,1.0)
rotated = cv2.warpAffine(image,matrix,(w,h))
cv2.imshow("rotaimage", rotated)
cv2.waitKey(0)
# 图片上画矩形
output = image.copy()
rectangle = cv2.rectangle(output,(1500,900),(600,400),(255,255,255),2)
cv2.imshow("output",output)
cv2.waitKey(0)
# 图片上写文字
output = image.copy()
text = cv2.putText(output,'opencv Demo',(500,500),cv2.FONT_HERSHEY_SIMPLEX,4,(255,0,0),2)
cv2.imshow("text",output)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 图片转换颜色
RGB_img = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
plt.imshow(RGB_img)
plt.show()
图片的translating : cv2.warpAffine(img,M,(cols,rows))
img:源图片
M:translation matrix偏移矩阵,如果偏移距离是(x,y)则偏移矩阵是:
M = [[1 0 x][0 1 y]],例如偏移量是(100,50)则 M 应该是 np.float32([[1,0,100],[0,1,50]])
def test10():
"""图片偏移"""
image = cv2.imread("add_s.jpg")
cv2.imshow("original",image)
cv2.waitKey(0)
M = np.float32([[1,0,100],[0,1,50]])
(rows, cols) = image.shape[:2]
# print((cols,rows))
res = cv2.warpAffine(image,M,(cols,rows))
cv2.imshow("translation",res)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.Canny(image, threshold1,thresold2):
Canny算法检测图片边缘。
threshold1:滞后过程的第一个阈值。
def test11():
"""图片边缘检测"""
image = cv2.imread("footprint.png")
cv2.imshow("original",image)
cv2.waitKey(0)
edges = cv2.Canny(image,100,200)
cv2.imshow("edges", edges)
cv2.waitKey(0)
cv2.destroyAllWindows()