# 图像大小 会输出[h w c] 高 宽 通道数
print(img.shape)
创建一个图像
# 创建一个三通道的图像 图像大小可以自己设定 np.zeros(H,W,C)
create_green = np.zeros((100,100,3),dtype=np.uint8)
# 设定图像三个通道的颜色值
# img[ y: y+h , x : x+w ] 分割图像
# numpy是BGR 所以第0个通道是B 蓝色 1是G 绿色 2是R 红色
create_green[:,:,0] = 0
create_green[:,:,1] = 255 #这里我创建一个纯绿色的图像
create_green[:,:,2] = 0
将灰度图二值化
img1 = cv2.imread("./test_img/008.json.png",cv2.IMREAD_GRAYSCALE) # 读取灰度图
# 二值化
# # 该函数第一个返回值是阈值的值,第二个是阈值化后的图像
# cv2.threshold(src, thresh, maxval, type[, dst]) src源图片 thresh 阈值 maxval最大值
# 第四个参数是一个方法选择参数 cv2.THRESH_BINARY 黑白二值
ret,binary = cv2.threshold(img1,1,255,cv2.THRESH_BINARY)
cv2.imshow("binary",binary)
cv2.waitKey(0)
# 搜索轮廓
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) #轮廓搜索
# 绘制轮廓
cv2.drawContours(img1,contours,-1,(255,255,255),1)
cv2.imshow("img1",img1)
cv2.waitKey(0)
ps:
这个寻找轮廓的函数cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])
第一个参数image,一般是单通道图像矩阵,可以是灰度图,但更常用的是二值图像
第二个参数mode,是轮廓的检索模式,可以选择以下几个参数
cv2.RETR_EXTERNAL
表示只检测外轮廓
cv2.RETR_LIST
检测的轮廓不建立等级关系
cv2.RETR_CCOMP
建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
cv2.RETR_TREE
建立一个等级树结构的轮廓。
第三个参数method为轮廓的近似办法:
cv2.CHAIN_APPROX_NONE
存储所有的轮廓点,相邻的两个点的像素位置差不超过1
cv2.CHAIN_APPROX_SIMPLE
压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,
该函数返回两个值:contours, hierarchy
countours
是轮廓本身,还有一个是每条轮廓对应的属性hierarchy
比如检测到4个轮廓,那么countours[0]
里面存的就是第一条轮廓点的集合(注意,这里面存的点是[y,x]形式,如[234,357],234是纵坐标)
通道分离与合并:
img = cv2.imread("test.jpg")
# 颜色通道切分 b g r分别是三个通道的值
b,g,r=cv2.split(img)
bgr=cv2.merge([b,g,r])#合并顺序为:B通道—>G通道—>R通道
rgb=cv2.merge([r,g,b])#合并顺序为:R通道—>G通道—>B通道
# opencv里面图像的通道顺序是B G R
# 也就意味着 B G R顺序分别是 0 1 2
# [:,:,0] 切片 前面俩冒号 代表取图像宽高的所有 后面0 代表B通道
cur_img=img.copy()
cur_img[:,:,0]=0 # B通道置为0
cur_img[:,:,1]=0 # G通道置为0
cv2.imshow("R",cur_img) # 也就是说只保留了R通道
cv2.waitKey(0)
文章出处登录后可见!
已经登录?立即刷新