日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

简易图片打像素标签工具

發布時間:2024/1/8 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简易图片打像素标签工具 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代碼鏈接:

功能:

制作圖片像素點數據集

打開文件夾中的圖片,通過鼠標點擊圖片獲取所在鼠標點的像素值,并把打的標簽導出為txt。

導入必要的函數庫

import math import os import cv2 as cv import numpy as np

定義一些全局變量后面會用到。patchsize表示采集的像素patch大小。

mode = True testflag = False idex = 0 patchsize = 9 # 對應像素塊大小 # 讀取圖片 dir = './pic' # 圖片存放的目錄

定義讀取圖片的函數,方便后面循環調用文件夾內的圖片。讀取后的圖片是narray的格式。

def readImage(dir, idex):"""讀取圖片"""filelist = os.listdir(dir)imgname = os.path.join(dir, filelist[idex])img1 = cv.imread(imgname) # 這里必須用cv庫里面的imread,否則格式不對會報錯return img1

定義bgr_patch函數獲得像素所處patch的像素平均值

def bgr_patch(img, y, x):"""輸入圖片img,輸入對應的坐標y,x,輸出這個坐標周圍一個patch的像素平均值"""global patchsizen = math.floor(patchsize / 2)bgr = img[y - n:y + (n + 1), x - n:x + (n + 1)] # 選取 5*5=25 的區域size = bgr.shape[0]sum1 = np.array([0, 0, 0])for i in range(size):for j in range(size):sum1 = sum1 + bgr[i, j]ave = sum1 / (size * size)ave = np.array([round(ave[0]), round(ave[1]), round(ave[2])])print(f"bgr test is {ave}")return ave

定義一個窗口函數,作為setMouseCallback的回調函數。在窗口函數中,通過鼠標的不同操作和鍵盤的操作實現不同的功能。

  • x,y:鼠標所在的位置
# 定義一個窗口 def draw_(event,x, y,flag,param):global idex, dir, mode, data, img1, testflag, patchsizen = math.floor(patchsize / 2)filelist = os.listdir(dir)if event == cv.EVENT_LBUTTONDOWN:"""左鍵單擊打標簽,按e打環境標簽,按r打道路標簽,按t切換測試集,中間滾動切換圖片,按c退出"""xy = "%d,%d" % (x, y)# bgr = img1[y, x] # 按照BGR排列,x和y是相反的# print(f"bgr origin is {bgr}")bgr = bgr_patch(img1, y, x) # 使用patchif mode:"""道路"""rgb = [bgr[2], bgr[1], bgr[0], y, x, 1] # 轉換成RGB排列y_size = img1.shape[0]x_size = img1.shape[1]rgb = [bgr[2] / 255, bgr[1] / 255, bgr[0] / 255,x / x_size, y / y_size, 1] # 歸一化 數值取到0——1之間print(f"rgb guiyi is {rgb}")cv.circle(img1, (x, y), n, (255, 0, 0), thickness=-1)# cv.putText(img1,xy,(x,y),fontFace=cv.FONT_HERSHEY_PLAIN# fontScale=2.0,color=(0,0,0),thickness= 1) # 顯示標簽值data.append(rgb)else:"""非道路"""rgb = [bgr[2], bgr[1], bgr[0], y, x, 0] # 轉換成RGB排列y_size = img1.shape[0]x_size = img1.shape[1]rgb = [bgr[2] / 255, bgr[1] / 255, bgr[0] / 255, x / x_size,y / y_size, 0] # 歸一化 數值取到0——1之間print(f"rgb guiyi is {rgb}")cv.circle(img1, (x, y), n, (0, 0, 255), thickness=-1)# cv.putText(img1,xy,(x,y),fontFace=cv.FONT_HERSHEY_PLAIN,# fontScale=2.0,color=(0,0,0),thickness= 1) # 顯示標簽值data.append(rgb)if event == cv.EVENT_MOUSEWHEEL:"""滾動觸發圖片切換"""if idex != len(filelist) - 2:idex = idex + 1else:idex = 0img1 = readImage(dir, idex)if event == cv.EVENT_MBUTTONDOWN:"""單擊鼠標中間,存儲數據"""if testflag:file = open('data_test.txt', mode='w+')file.writelines(str(data))file.close()else:file = open('data_train.txt', mode='w+')file.writelines(str(data))file.close()

創建opencv窗口,命名為image,設置鼠標響應函數

cv.namedWindow('image') cv.setMouseCallback('image', draw_)

主函數寫在while循環里面。

# 創建一個列表存儲標簽和RGB值 data = [] label = [] img1 = readImage(dir, idex)while 1:cv.imshow('image', img1)k = cv.waitKey(1) & 0xFFif k == ord('r'):mode = Trueelif k == ord('e'):mode = Falseelif k == ord('t'):testflag = ~testflagprint(f"[testflag] is :{testflag}")elif k == ord('c'):break cv.destroyAllWindows()

總結

以上是生活随笔為你收集整理的简易图片打像素标签工具的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。