目标:去掉ROI区域以外的噪声,进而获取不规则ROI区域的外接矩形。
其中离散点的去除,采用的是opencv中的高斯滤波+OSTU方法进行滤除,但是该方法仍然会降ROI区域中的某些阈值较低的信息给滤除掉,暂时没有想到更好的办法去除离散点
# Author:yx
# Time:2022.7.21
# Function: 去掉ROI区域以外的噪声,进而获取不规则ROI区域的外接矩形。
from tkinter import Image
import cv2
import numpy as np
import skimage
def zuidawaijie(Img):
Img_H = Img.shape[0]
Img_W = Img.shape[1]
Top = 0
Bottom = 0
Left = 0
Right = 0
# 识别外边框
# 识别Top的第一个点
for i in range(Img_H):
for j in range(Img_W):
if Img[i, j].all() != 0:
Top = i
break
if Top != 0:
break
# 识别Bottom的第一个点
for i in range(Img_H):
for j in range(Img_W):
if Img[Img_H -1 - i, j].all() !=0:
Bottom = Img_H -1 - i
break
if Bottom != 0:
break
# 识别Left的第一个点
for j in range(Img_W):
for i in range(Img_H):
if Img[i, j].all() != 0:
Left = j
break
if Left != 0:
break
# 识别Right的第一个点
for j in range(Img_W):
for i in range(Img_H):
if Img[i, Img_W -1 - j].all() !=0:
Right = Img_W - 1 - j
break
if Right != 0:
break
# top
for i in range(Left, Right):
Img[Top, i] = 255
# bottom
for i in range(Left, Right):
Img[Bottom, i] = 255
# Left
for i in range(Top, Bottom):
Img[i, Left] = 255
# Right
for i in range(Top, Bottom):
Img[i, Right] = 255
cv2.imshow('Img', Img)
cv2.waitKey()
cropImg = Img[Top:Bottom, Left:Right]
return cropImg,Top,Bottom,Left,Right
if __name__ == '__main__':
img = cv2.imread('./calPosition/1328.png', 0)
blur = cv2.GaussianBlur(img, (3, 3), 0)
_, binary_img = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cropbinary_img,Top,Bottom,Left,Right = zuidawaijie(binary_img)
cropImg = img[Top:Bottom, Left:Right]
# 上下平移量 负数上移 正数下移
DUnum = 100
# 左右平移量 负数左移 正数右移
LRnum = 100
img[Top-DUnum:Bottom-DUnum, Left-LRnum:Right-LRnum] = cropImg
cv2.imshow('img', img)
cv2.waitKey()