opencv库的基本使用(python)

opencv库的基本使⽤(python)
1.图⽚的读取与保存
# -*- coding: utf-8 -*-
# @Author: Xingmo
import cv2
import numpy as np
# 读取图⽚: cv2.imread(路径,num) 其中num=0,为灰度图像;num=1为彩图
img = cv2.imread('002.jpg',0)
# 创建窗⼝,cv2.namedWindow(窗⼝名)
cv2.namedWindow('image')
# 保存图⽚,cv2.imwrite(保存图⽚名,要保存的图⽚)
碧玄岩
cv2.imwrite('002.jpg',img)
# 第三个参数针对特定的格式:对于JPEG,其表⽰的是图像的质量,⽤0-100的整数表⽰(越⾼越清晰,压缩级别越低),默认为95。注意,cv2.IMWRITE_JPEG_QU cv2.imwrite('003.jpg',img,[int(cv2.IMWRITE_JPEG_QUALITY), 10])
# 对于PNG,第三个参数表⽰的是压缩级别。cv2.IMWRITE_PNG_COMPRESSION,从0到9,压缩级别越⾼,图像尺⼨越⼩。默认级别为3
cv2.imwrite('004.png', img, [int(cv2.IMWRITE_PNG_COMPRESSION), 5])
# 图⽚显⽰,cv2.imshow(窗⼝名,要显⽰的图⽚)
cv2.imshow('image1',img)
# 复制img图⽚
#emptyimage = py()
# 创建空图⽚
emptyimage = np.zeros(img.shape,np.uint8)
cv2.imshow('image2',emptyimage)
# 键盘绑定函数
cv2.waitKey(0)
# 释放窗⼝
cv2.destroyAllWindows()
2.像素点的操作,添加椒盐噪声
# -*- coding: utf-8 -*-
# @Author: Xingmo
import cv2
import numpy as np
# 添加椒盐噪声
def salt(img):
for k in range(100):
# 建⽴图⽚随机坐标点
i = int(np.random.random()*img.shape[0])        j = int(np.random.random()*img.shape[1])        # 图⽚为灰度图像,有⼆维
if img.ndim == 2:
img[i,j] = 255
# 图⽚为彩⾊图⽚,有三维,RGB抗坏血酸过氧化物酶
elif img.ndim == 3:
img[i,j,0] = 255
img[i,j,1] = 255
img[i,j,2] = 255
return img
if __name__ == '__main__':
# 读取图⽚
img = cv2.imread('001.jpg')
# 添加噪声
saltImage = salt(img)
# 图⽚显⽰
cv2.imshow("Salt", saltImage)
# 图⽚保存
cv2.imwrite('salt.jpg',saltImage)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.彩⾊图⽚各通道分离与合并
# -*- coding: utf-8 -*-
# @Author: Xingmo
作为生物的社会
import cv2
img = cv2.imread('001.jpg')
# split 返回BGR三个通道
b,g,r = cv2.split(img)
# merged 通道合并
merge = ([b,g,r])
cv2.imshow('merge',merge)
#cv2.imshow("Red", r)
#cv2.imshow("Green", g)
#cv2.imshow("Blue", b)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.直⽅图的绘画
# -*- coding: utf-8 -*-
# @Author: Xingmo
>## 说明 >##
# cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]]) #返回hist
# 第⼀个参数为读取的图像,必须⽤⽅括号括起来。
# 第⼆个参数是⽤于计算直⽅图的通道,这⾥使⽤灰度图计算直⽅图,所以就直接使⽤第⼀个通道;
# 第三个参数是Mask,这⾥没有使⽤,所以⽤None。
# 第四个参数是histSize,表⽰这个直⽅图分成多少份(即多少个直⽅柱)。第⼆个例⼦将绘出直⽅图,到时候会清楚⼀点。# 第五个参数是表⽰直⽅图中各个像素的值,[0.0, 256.0]表⽰直⽅图能表⽰像素值从0.0到256的像素。
# 最后是两个可选参数,由于直⽅图作为函数结果返回了,所以第六个hist就没有意义了(待确定)
# 最后⼀个accumulate是⼀个布尔值,⽤来表⽰直⽅图是否叠加。
>##
# cv.PolyLine(img, polys, is_closed, color, thickness=1, lineType=8, shift=0)  # 返回None
# img        读取的图像
# polys      多边形曲线的数组(各个坐标点)
# is_closed  绘制的折线是否关闭的标志,起始点是否有线连接,False为没有
# color      折线的颜⾊ [b,g,r]
# thickness  折线边缘的厚度
# lineType  线段的类型
# shift      顶点坐标中的⼩数位数
>###  说明END  >##
import cv2
import numpy as np
# 将直⽅图(填充)转化为图⽚
def calcAndDrawHist(image, color):
hist = cv2.calcHist([image], [0], None, [256], [0.0,255.0])
# cv2.minMaxLoc 最⼤值maxVal和最⼩值minVal及它们的位置
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(hist)
# 创建全零图像
histImg = np.zeros([256,256,3], np.uint8)
hpt = int(0.95* 256);
for h in range(256):
# hpt=0.95*256 0.95防⽌最⼤值为整张图⽚的⾼,每个hist与最⼤值的⽐*(256*0.95)即可表⽰该hist在图⽚中的⾼度
intensity = int(hist[h]*hpt/maxVal)
# cv2.line(图像img,第⼀个点坐标(x1,y1),第⼆个点坐标(x2,y2),颜⾊[b,g,r])
cv2.line(histImg,(h,256), (h,256-intensity), color)
return histImg
# 将直⽅图(折线)转化为图⽚
def DrawHist(img):
# 建⽴空图⽚
h = np.zeros((256,256,3))
# 直⽅图中各bin的顶点位置
bins = np.arange(256).reshape(256,1)
# BGR三种颜⾊
color = [ (255,0,0),(0,255,0),(0,0,255) ]
for ch, col in enumerate(color):
originHist = cv2.calcHist([img],[ch],None,[256],[0,256])
# alize(图像img,输出图像,归⼀化后最低值,归⼀化后最⼤值,规范化类型 cv2.NORM_M
INMAX:仅针对密集阵列)        alize(originHist, originHist,0,255*0.9,cv2.NORM_MINMAX)
# np.around(array) 取整数,但数据类型仍为float
hist=np.int32(np.around(originHist))
测井解释hist=np.int32(np.around(originHist))
# np.column_stack 将两个1-D数组作为列堆叠成2维数组
pts = np.column_stack((bins,hist))
# cv2.polylines(图像img,多边形曲线的数组,绘制的折线是否关闭的标志,折线颜⾊)        cv2.polylines(h,[pts],False,col)
# np.flipud 在上/下⽅向翻转数组。
信息技术的负面影响h=np.flipud(h)
return h
'''
>## 灰度图像———直⽅图(填充) >##
img = cv2.imread('001.jpg',0)
histimg = calcAndDrawHist(img,[255,255,255])
cv2.imshow('hist',histimg)
cv2.waitKey(0)
'''
>## 彩⾊图像———直⽅图(填充) >##
if __name__ == '__main__':
# 读取图⽚
img = cv2.imread("001.jpg")
# cv2.spilt 返回BGR三个通道
b, g, r = cv2.split(img)
# calcAndDrawHist(图像img,color填[b,g,r])
histImgB = calcAndDrawHist(b, [255, 0, 0])
histImgG = calcAndDrawHist(g, [0, 255, 0])
histImgR = calcAndDrawHist(r, [0, 0, 255])
cv2.imshow("histImgB", histImgB)
cv2.imshow("histImgG", histImgG)
cv2.imshow("histImgR", histImgR)
cv2.imshow("Img", img)
>## 彩⾊图像———直⽅图(折线) >##
if __name__ == '__main__':
img = cv2.imread("001.jpg")
h = DrawHist(img)
cv2.imshow('colorhist',h)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果显⽰:
彩⾊图像———直⽅图(填充)
彩⾊图像———直⽅图(折线)
5.形态学运算:膨胀与腐蚀
# -*- coding: utf-8 -*-
# @Author: Xingmo
import cv2
import numpy as np
# 读取图像
img = cv2.imread('004.jpg',0);
# 构造⼀个3×3的结构元素
element = StructuringElement(cv2.MORPH_RECT,(3, 3))
# 膨胀图像 cv2.dilate(图像,元素结构)
dilate = cv2.dilate(img, element)
# 腐蚀图像 de(图像,元素结构)
erode = de(img, element)
# 将两幅图像相减获得边,第⼀个参数是膨胀后的图像,第⼆个参数是腐蚀后的图像
result = cv2.absdiff(dilate,erode);
# 上⾯得到的结果是灰度图,cv2.threshold将其⼆值化以便更清楚的观察结果
# cv2.threshold(src , thresh, maxval, type[, dst])  返回retval、dst
# cv2.threshold(图像, 阈值  , 最⼤值, 阈值类型)    返回值类型、返回处理后图像
# 阈值类型:THRESH_BINARY、THRESH_BINARY_INV、THRESH_TRUNC、THRESH_TOZERO、THRESH_TOZERO_INV retval, result = cv2.threshold(result, 40, 255, cv2.THRESH_BINARY);
# 反⾊,即对⼆值图每个像素取反
result = cv2.bitwise_not(result);
# 显⽰图像回来我的爱 阳一
cv2.imshow("origin",img);  # 原图
cv2.imshow("result",result);# 边缘检测图
cv2.waitKey(0)
cv2.destroyAllWindows()
结果显⽰:

本文发布于:2024-09-22 15:42:09,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/116785.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图像   折线   数组
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议