一、和图像交互获得图像的坐标和像素值
python
import cv2
import numpy as np
import signal
import threading
import time
if __name__ == '__main__':
img = cv2.imread('XXX',0)#读取图片
font_face,font_scale,thickness=cv2.FONT_HERSHEY_SIMPLEX,0.5,1
#鼠标交互
def mouseHandler(event,x,y,flags,param):
points = (x,y)
global imgCopy
#鼠标左键双击事件
if event == cv2.EVENT_LBUTTONDBLCLK:
#拷贝一张与原图像格式相同的新图像
imgCopy = img.copy()
#拼接文字
text = '['+str(x)+','+str(y)+']'+str(img[y,x])
print(text)
#读取文字(宽,高),下基线
(t_w,t_h),baseLine = cv2.getTextSize(text,font_face,font_scale,thickness)
#在鼠标当前位置的左上角显示文字
cv2.putText(imgCopy,text,(x-t_w,y),font_face,font_scale,(125,125,125))
cv2.imshow('win',imgCopy)
#鼠标移动事件
elif event == cv2.EVENT_MOUSEMOVE:
#显示原图片能使文本框消失
cv2.imshow('win',img)
cv2.namedWindow('win')
#窗口与回调函数绑定
cv2.setMouseCallback('win',mouseHandler)
cv2.imshow('win',img)
cv2.waitKey()
二、二值化图像
python
import cv2
import numpy as np
import signal
import threading
import time
if __name__ == '__main__':
img = cv2.imread('path',0)#读取图片
ret, binary = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
print("threshold value %s" % ret) #打印阈值,超过阈值显示为白色,低于该阈值显示为黑色
cv2.imshow("threshold", binary) #显示二值化图像
cv2.waitKey(0)
cv2.destroyAllWindows()
批量图像二值化
python
import cv2
import numpy as np
import signal
import threading
import time
import os
import sys
import random
import datetime
import argparse
def get_files(path):
files = []
for filename in os.listdir(path):
if os.path.isfile(os.path.join(path, filename)):
files.append(filename)
return files
if __name__ == '__main__':
files_path="XXX"
#print(files_path)
image_files = get_files(files_path)
i=1
#print(image_files)
for image_file in image_files:
image_path=os.path.join(files_path , image_file)
print(image_path)
img = cv2.imread(image_path,0)#读取图片
start_time_init = time.perf_counter()
ret, binary = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
end_time_init = time.perf_counter()
elapsed_time_init = (end_time_init - start_time_init)*1000
print("二值化时间: {} ms".format(elapsed_time_init))
print("threshold value %s" % ret) #打印阈值,超过阈值显示为白色,低于该阈值显示为黑色s
cv2.imwrite(files_path+"/binary/"+str(i)+".png",binary)
i=i+1
三、区域合并提取最大连通域
python
import cv2
import numpy as np
import signal
import threading
import time
import os
import sys
import random
import datetime
import argparse
def get_files(path):
files = []
for filename in os.listdir(path):
if os.path.isfile(os.path.join(path, filename)):
files.append(filename)
return files
if __name__ == '__main__':
#files_path="/home/robot/PaddleOCR-2.6.0/data/OK0828/raw_data/"
files_path="/home/robot/PaddleOCR-2.6.0/data/829/"
files_path="/home/robot/PaddleOCR-2.6.0/data/NG0823/"
#print(files_path)
image_files = get_files(files_path)
i=1
#print(image_files)
for image_file in image_files:
image_path=os.path.join(files_path , image_file)
print(image_path)
img = cv2.imread(image_path,0)#读取图片
start_time_init = time.perf_counter()
ret, binary = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
end_time_init = time.perf_counter()
elapsed_time_init = (end_time_init - start_time_init)*1000
print("二值化时间: {} ms".format(elapsed_time_init))
print("threshold value %s" % ret) #打印阈值,超过阈值显示为白色,低于该阈值显示为黑色s
cv2.imwrite(files_path+"/binary/"+str(i)+".png",binary)
i=i+1
# cv2.imshow("threshold", binary) #显示二值化图像
# cv2.waitKey(0)
# cv2.destroyAllWindows()
start_time = time.perf_counter()
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(binary)
end_time = time.perf_counter()
elapsed_time = (end_time - start_time)*1000
print("连通域的时间: {} ms".format(elapsed_time))
max_area=0
j=0
for st in stats[1:]:
j=j+1
area=st[4]
if(max_area<area):
max_area=area
index=j
print("index",index)
print("max_area",max_area)
#index=index+1
print('num_labels: ', num_labels)
labels[labels>0] = 255
labels = labels.astype(np.uint8)
# #将一维灰度图像扩展到三维
labels= np.expand_dims(labels,axis=2).repeat(3,axis=2).astype(np.uint8)
# for st in stats[1:]:
cv2.rectangle(labels, (stats[index][0], stats[index][1]), (stats[index][0]+stats[index][2], stats[index][1]+stats[index][3]), (0, 255, 0), 3)
#cv2.imshow('labels', labels)
#cv2.waitKey(0)
cv2.imwrite(files_path+"/labels/"+str(i)+".png",labels)