python opencv多边形掩膜 掩码

python opencv多边形掩膜 掩码coding utf 8importnumpy cv2 imread d bgs jpg b np array 100 100 250 100 300 220 100 230 dtype np int32 im np zeros image shape 2 dtype

目录

掩膜方法1:

提取掩摸方法2:提取掩膜内的图片:其余是0

改变掩摸内容:

掩摸反向选择操作,比如改变背景:

python画多边形:

多边形ROI,主要利用鼠标交互进行绘制:

多边形ROI实例,保存csv


掩膜方法1:

坐标点需要顺时针顺序。

img = cv2.imread(r'd:/nv1.jpg') shape = img.shape points_704 = np.array([[80, 130], [140, 130], [170, 50], [225, 50]]) img_origin = img.copy() cv2.fillConvexPoly(img, points_704, 1) bitwisexor = cv2.bitwise_xor(img, img_origin) cv2.imshow("asdf",bitwisexor) cv2.waitKey(0)

提取掩摸方法2:提取掩膜内的图片:其余是0

# coding=utf-8 import numpy as np import cv2 image = cv2.imread("d:/bgs.jpg") b = np.array([[[100,100], [250,100], [300,220],[100,230]]], dtype = np.int32) im = np.zeros(image.shape[:2], dtype = "uint8") cv2.polylines(im, b, 1, 255) cv2.fillPoly(im, b, 255) mask = im cv2.imshow("Mask", mask) masked = cv2.bitwise_and(image, image, mask=mask) cv2.imshow("Mask to Image", masked) cv2.waitKey(0)

改变掩摸内容:

# -*- coding: utf-8 -*- import os import numpy as np import cv2 import cv2 import numpy as np mask_threth = 50 img = cv2.imread('d:/rat_466-100-100.jpg') #自己截图一张图片就行,要大于下面的坐标点 # binary mask coordinates = [] coordinate1 = [[[40, 135], [168,132], [264,330], [2,328]]] coordinate2 = [[[300, 300], [600,300], [600,600], [300,600]]] coordinate1 = np.array(coordinate1) coordinate2 = np.array(coordinate2) coordinates.append(coordinate1) coordinates.append(coordinate2) mask = np.zeros(img.shape[:2], dtype=np.int8) mask = cv2.fillPoly(mask, coordinates, 255) cv2.imwrite('./mask1.png', mask) bbox_mask = mask color_mask = np.array([0, 0, 255], dtype=np.uint8) bbox_mask = bbox_mask.astype(np.bool) # cv2.imwrite('./bbox_mask.png', bbox_mask) img[bbox_mask] = color_mask * 0.5 cv2.imshow("sadf",img) cv2.waitKey()

掩摸反向选择操作,比如改变背景:

# -*- coding: utf-8 -*- import os import numpy as np import cv2 import cv2 import numpy as np mask_threth = 50 img = cv2.imread('d:/rat_466-100-100.jpg') #自己截图一张图片就行,要大于下面的坐标点 # binary mask coordinates = [] coordinate1 = [[[40, 135], [168,132], [264,330], [2,328]]] coordinate2 = [[[300, 300], [600,300], [600,600], [300,600]]] coordinate1 = np.array(coordinate1) coordinate2 = np.array(coordinate2) coordinates.append(coordinate1) coordinates.append(coordinate2) bbox_mask = np.zeros(img.shape[:2], dtype=np.int8) bbox_mask[::]=255 bbox_mask = cv2.fillPoly(bbox_mask, coordinates, 0) cv2.imshow("mask",bbox_mask) color_mask = np.array([0, 0, 255], dtype=np.uint8)* 0.5 bbox_mask = bbox_mask.astype(np.bool) img[bbox_mask] =[0, 0, 255]# color_mask cv2.imshow("sadf",img) cv2.waitKey()

如果是两张图叠加:

改为同等大小的图的掩摸部分:

src2[bbox_mask] = img_o[bbox_mask]

python画多边形:

注意:a为多边形坐标点,需要是三维的,比如[1,4,2]

外面的是list或者numpy矩阵都支持。

 import numpy as np import cv2 a = np.array([[10,10], [50,10], [100,100], [10,80]], dtype = np.int32) b = np.array([[[50,100], [200,230], [150,200], [150,220]]], dtype = np.int32) print(a.shape) im = np.zeros([240, 320,3], dtype = np.uint8) cv2.polylines(im, [a], 1, (0,0,255)) cv2.fillPoly(im, b, (0,255,255)) cv2.imshow("image",im) cv2.waitKey()

多边形ROI,主要利用鼠标交互进行绘制:

1. 单击左键,选择多边形的点;

2. 单击右键,删除最近一次选择的点;

3. 单击中键,确定ROI区域并可视化。

4. 按”S“键,将多边形ROI区域的点保存到本地”config.pkl”文件中。

话不多说,以下是核心代码

import cv2    import numpy as np import joblib    pts = []  # 用于存放点       # 统一的:mouse callback function def draw_roi(event, x, y, flags, param):     img2 = img.copy()        if event == cv2.EVENT_LBUTTONDOWN:  # 左键点击,选择点         pts.append((x, y))        if event == cv2.EVENT_RBUTTONDOWN:  # 右键点击,取消最近一次选择的点         pts.pop()        if event == cv2.EVENT_MBUTTONDOWN:  # 中键绘制轮廓         mask = np.zeros(img.shape, np.uint8)         points = np.array(pts, np.int32)         points = points.reshape((-1, 1, 2))         # 画多边形         mask = cv2.polylines(mask, [points], True, (255, 255, 255), 2)         mask2 = cv2.fillPoly(mask.copy(), [points], (255, 255, 255))  # 用于求 ROI         mask3 = cv2.fillPoly(mask.copy(), [points], (0, 255, 0))  # 用于 显示在桌面的图像            show_image = cv2.addWeighted(src1=img, alpha=0.8, src2=mask3, beta=0.2, gamma=0)            cv2.imshow("mask", mask2)         cv2.imshow("show_img", show_image)            ROI = cv2.bitwise_and(mask2, img)         cv2.imshow("ROI", ROI)         cv2.waitKey(0)        if len(pts) > 0:         # 将pts中的最后一点画出来         cv2.circle(img2, pts[-1], 3, (0, 0, 255), -1)        if len(pts) > 1:         # 画线         for i in range(len(pts) - 1):             cv2.circle(img2, pts[i], 5, (0, 0, 255), -1)  # x ,y 为鼠标点击地方的坐标             cv2.line(img=img2, pt1=pts[i], pt2=pts[i + 1], color=(255, 0, 0), thickness=2)        cv2.imshow('image', img2)       # 创建图像与窗口并将窗口与回调函数绑定 img = cv2.imread("111.jpg")    cv2.namedWindow('image') cv2.setMouseCallback('image', draw_roi) print("[INFO] 单击左键:选择点,单击右键:删除上一次选择的点,单击中键:确定ROI区域") print("[INFO] 按‘S'确定选择区域并保存") print("[INFO] 按 ESC 退出")    while True:     key = cv2.waitKey(1) & 0xFF     if key == 27:         break     if key == ord("s"):         saved_data = {             "ROI": pts         }         joblib.dump(value=saved_data, filename="config.pkl")         print("[INFO] ROI坐标已保存到本地.")         break cv2.destroyAllWindows()

绘制不规则多边形:

python opencv多边形掩膜 掩码

然后按鼠标中python opencv多边形掩膜 掩码

多边形ROI实例,保存csv

import cv2 import numpy as np import pandas as pd from skimage import io from get_point import cross_point,GetCrossPoint,Point,Line label_file='S1.csv' df_label = pd.read_csv(label_file) def get_temper(value): return value/ 100 - 273.15 aaa=[] import pandas as pd headers = ['file_name', 'max_temp', 'min_temp', 'mean_temp','len'] datas=[] max_temp=0 min_temp=100 for index_a, data in df_label.iterrows(): id_path="S1/"+ data["ID"]+".tiff" img_path="S1/"+ data["ID"].replace("R","N")+".jpg" img_show=cv2.imread(img_path) img_tif = io.imread(id_path) end=73 for ai in range(73): p_x = data['x' + str(ai)] p_y = data['y' + str(ai)] if np.isnan(p_x) or np.isnan(p_y): if ai == 43: end = 42 break print("end",end) pts = [] pts_right=[] for ai in range(end): p_x=data['x'+str(ai)] p_y=data['y'+str(ai)] if np.isnan(p_x) or np.isnan(p_y): continue p_x=int(min(img_show.shape[1]-1,max(0,p_x))) p_y=int(min(img_show.shape[0]-1,max(0,p_y))) font = cv2.FONT_HERSHEY_SIMPLEX if end==42: if ai > 27 and ai < 36: # mouse continue cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0)) cv2.putText(img_show, str(ai ), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA) # print(ai,p_x, p_y, round(img_tif[int(p_y)][int(p_x)] , 2)) elif ai>16 and ai<22: #nose continue cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0)) cv2.putText(img_show, str(ai), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA) pts.append([p_x, p_y]) elif ai>=39 and ai<=44: #forehead continue cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0)) cv2.putText(img_show, str(ai), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA) pts.append([p_x, p_y]) elif (ai >= 10 and ai <= 11) or ( ai>37 and ai<=38): # xiaba # continue cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0)) cv2.putText(img_show, str(ai), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA) pts.append([p_x, p_y]) else: continue cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0)) cv2.putText(img_show, str(ai), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA) pts.append([p_x, p_y]) elif end==73: if ai > 27 and ai < 36: #nose continue cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0)) cv2.putText(img_show, str(ai ), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA) # print(ai,p_x, p_y, round(img_tif[int(p_y)][int(p_x)] , 2)) pts.append([p_x, p_y]) elif ai >= 68 and ai <= 72: # forehead continue cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0)) cv2.putText(img_show, str(ai), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA) pts.append([p_x, p_y]) elif (ai >= 6 and ai <= 10) or(ai==57): # xiaba cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0)) cv2.putText(img_show, str(ai), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA) pts.append([p_x, p_y]) else: continue cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0)) cv2.putText(img_show, str(ai), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA) pts.append([p_x, p_y]) # if ai>47 and ai<68: # cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0)) # cv2.putText(img_show, str(ai + 1), (p_x,p_y+5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA) # # print(ai,p_x, p_y, round(img_tif[int(p_y)][int(p_x)] , 2)) # pts.append([p_x, p_y]) if len(pts)>2: mask = np.zeros(img_tif.shape, np.uint8) points = np.array(pts, np.int32) points = points.reshape((-1, 1, 2)) mask2 = cv2.fillPoly(mask.copy(), [points], (255, 255, 255)) # 用于求 ROI ROI=img_tif[mask2 > 0] b = np.sum(ROI) max_v=np.around(get_temper(max(ROI)),2) min_v=np.around(get_temper(min(ROI)),2) avg_v=np.around(get_temper(b/len(ROI)),2) # print("max",max_v,"min",min_v,"avg",avg_v) max_temp=max(max_temp,max_v) min_temp=min(min_temp,min_v) aaa.append(get_temper(b/len(ROI))) gdp1 = pd.Series([img_path, max_v, min_v, avg_v, len(ROI)],index=headers) datas.append(gdp1) cv2.imshow("ROI", mask2) cv2.imshow("img_show", img_show) cv2.waitKey(1) gdp4=pd.concat(datas,axis=1).T gdp4.to_csv("xiaba.csv",index=False) node_data=np.asarray(aaa) noze_avg= np.sum(node_data)/len(node_data) print(noze_avg,len(node_data),"max",max_temp,"min",min_temp) 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202702.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午11:30
下一篇 2026年3月19日 下午11:31


相关推荐

  • Python爬虫之女神网图片(三)

    Python爬虫之女神网图片(三)女神网是一个可以搜索女神的图片的网站。废话不说,直接来干货:环境配置:系统环境:WIN7/8/10编译环境:Python3+所需库:requests、re、os、pymongo、Beatifulsoup、timeIDE:Pycharmnvshen.py#!/usr/bin/python#-*-coding:utf-8-*-importrequestsfromrequestsi…

    2022年6月8日
    51
  • 几何向量:叉积和夹角(左手定则)

    几何向量:叉积和夹角(左手定则)最近又回顾了一遍叉积 概念我们应该了解 几何上就是向量 a 和 b 那么向量 a 和 b 的叉积得到向量 c 向量 c 与向量 a 和 b 相互垂直 也就是说向量 c 垂直于向量 a 和 b 所在的平面 同时向量 c 的模长等于向量 a 和 b 组成的平行四边形的面积 物理上叉积的意义就是力矩的意义 这里回顾一下以前写的叉积篇 叉积实际上有个重要的问题以前忽视掉了 那就是 unity 左手坐标

    2026年3月17日
    1
  • python3+Scrapy爬虫实战(一)—— 初识Scrapy

    python3+Scrapy爬虫实战(一)—— 初识Scrapy目录目录初识Scrapy开发环境创建项目创建爬虫项目结构图创建Item分析HTML爬取网页Markdown及扩展表格定义列表代码块脚注目录数学公式UML图:离线写博客浏览器兼容初识Scrapy本人是一名Scrapy的爱好者和初学者,写这文章主要是为了加深对Scrapy的了解,如果文章中有写的不对或者有更好的方式方…

    2022年6月26日
    32
  • Claude 镜像站合集,国内可用

    Claude 镜像站合集,国内可用

    2026年3月15日
    2
  • 单片机原理及应用复习「建议收藏」

    单片机原理及应用复习「建议收藏」单片机总复习1.什么是单片机?特点?将通用微型计算机基本功能部件集成在一块芯片上构成的一种专用微计算机系统(嵌入式系统),用于解决小型被控对象的智能化问题(SCM或MCU)。特点:体积小(便于嵌入到小型被控对象中);扩展性好(便于组成各种应用系统);可靠性高(集成后外部连线减少,抗干扰能力增强);价格低廉(便于普及应用)2.单片机的发展趋势3.进制之间的转换搞明白点注意下有符号数还是…

    2025年9月21日
    8
  • Eclipse环境下如何配置Tomcat,并且把项目部署到Tomcat服务器上「建议收藏」

    eclipse环境下如何配置tomcat打开Eclipse,单击“Window”菜单,选择下方的“Preferences”。单击“Server”选项,选择下方的“RuntimeEnvironments”。点击“Add”添加Tomcat。点击“Next”,选中自己安装的Tomcat路径。点击“Finish”完成。建立一个Web应用File→New→DynamicWeb

    2022年4月16日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号