Spaces:
Running
Running
| import os.path | |
| import cv2 | |
| import numpy as np | |
| from skimage import measure | |
| def imageResize(Image, downsizeRatio): | |
| ##This program resize the original image | |
| ##Input: original image and downsizeRatio (user defined parameter: 0.75, 0.5 or 0.2) | |
| ##Output: the resized image according to the given ratio | |
| if downsizeRatio < 1:#len(ImgFileList) | |
| ImgResized = cv2.resize(Image, dsize=None, fx=downsizeRatio, fy=downsizeRatio) | |
| else: | |
| ImgResized = Image | |
| ImgResized = np.uint8(ImgResized) | |
| return ImgResized | |
| def creatMask(Image, threshold = 10): | |
| ##This program try to creat the mask for the filed-of-view | |
| ##Input original image (RGB or green channel), threshold (user set parameter, default 10) | |
| ##Output: the filed-of-view mask | |
| if len(Image.shape) == 3: ##RGB image | |
| gray = cv2.cvtColor(Image, cv2.COLOR_BGR2GRAY) | |
| Mask0 = gray >= threshold | |
| else: #for green channel image | |
| Mask0 = Image >= threshold | |
| # ######get the largest blob, this takes 0.18s | |
| cvVersion = int(cv2.__version__.split('.')[0]) | |
| Mask0 = np.uint8(Mask0) | |
| contours, hierarchy = cv2.findContours(Mask0, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) | |
| areas = [cv2.contourArea(c) for c in contours] | |
| max_index = np.argmax(areas) | |
| Mask = np.zeros(Image.shape[:2], dtype=np.uint8) | |
| cv2.drawContours(Mask, contours, max_index, 1, -1) | |
| ResultImg = Image.copy() | |
| if len(Image.shape) == 3: | |
| ResultImg[Mask ==0] = (255,255,255) | |
| else: | |
| ResultImg[Mask==0] = 255 | |
| return ResultImg, Mask | |
| def shift_rgb(img, *args): | |
| result_img = np.empty_like(img) | |
| shifts = args | |
| max_value = 255 | |
| # print(shifts) | |
| for i, shift in enumerate(shifts): | |
| lut = np.arange(0, max_value + 1).astype("float32") | |
| lut += shift | |
| lut = np.clip(lut, 0, max_value).astype(img.dtype) | |
| if len(img.shape)==2: | |
| print(f'=========grey image=======') | |
| result_img = cv2.LUT(img,lut) | |
| else: | |
| result_img[..., i] = cv2.LUT(img[...,i],lut) | |
| return result_img | |
| def cropImage_bak(Image, Mask): | |
| Image = Image.copy() | |
| Mask = Mask.copy() | |
| leftLimit, rightLimit, upperLimit, lowerLimit = getLimit(Mask) | |
| if len(Image.shape) == 3: | |
| ImgCropped = Image[upperLimit:lowerLimit, leftLimit:rightLimit, :] | |
| MaskCropped = Mask[upperLimit:lowerLimit, leftLimit:rightLimit] | |
| ImgCropped[:20, :, :] = 0 | |
| ImgCropped[-20:, :, :] = 0 | |
| ImgCropped[:, :20, :] = 0 | |
| ImgCropped[:, -20:, :] = 0 | |
| MaskCropped[:20, :] = 0 | |
| MaskCropped[-20:, :] = 0 | |
| MaskCropped[:, :20] = 0 | |
| MaskCropped[:, -20:] = 0 | |
| else: #len(Image.shape) == 2: | |
| ImgCropped = Image[upperLimit:lowerLimit, leftLimit:rightLimit] | |
| MaskCropped = Mask[upperLimit:lowerLimit, leftLimit:rightLimit] | |
| ImgCropped[:20, :] = 0 | |
| ImgCropped[-20:, :] = 0 | |
| ImgCropped[:, :20] = 0 | |
| ImgCropped[:, -20:] = 0 | |
| MaskCropped[:20, :] = 0 | |
| MaskCropped[-20:, :] = 0 | |
| MaskCropped[:, :20] = 0 | |
| MaskCropped[:, -20:] = 0 | |
| cropLimit = [upperLimit, lowerLimit, leftLimit, rightLimit] | |
| return ImgCropped, MaskCropped, cropLimit | |
| ######################################################## | |
| ###new function to get the limit for cropping. | |
| ###try to get higher speed than np.where, but not working. | |
| def getLimit(Mask): | |
| Mask1 = Mask > 0 | |
| colSums = np.sum(Mask1, axis=1) | |
| rowSums = np.sum(Mask1, axis=0) | |
| maxColSum = np.max(colSums) | |
| maxRowSum = np.max(rowSums) | |
| colList = np.where(colSums >= 0.01*maxColSum)[0] | |
| rowList = np.where(rowSums >= 0.01*maxRowSum)[0] | |
| leftLimit0 = np.min(rowList) | |
| rightLimit0 = np.max(rowList) | |
| upperLimit0 = np.min(colList) | |
| lowerLimit0 = np.max(colList) | |
| margin = 50 | |
| leftLimit = np.clip(leftLimit0-margin, 0, Mask.shape[1]) | |
| rightLimit = np.clip(rightLimit0+margin, 0, Mask.shape[1]) | |
| upperLimit = np.clip(upperLimit0 - margin, 0, Mask.shape[0]) | |
| lowerLimit = np.clip(lowerLimit0 + margin, 0, Mask.shape[0]) | |
| return leftLimit, rightLimit, upperLimit, lowerLimit | |
| def cropImage(Image, Mask): | |
| ##This program will crop the filed of view based on the mask | |
| ##Input: orginal image, origimal Mask (the image needs to be RGB resized image) | |
| ##Output: Cropped image, Cropped Mask, the cropping limit | |
| height, width = Image.shape[:2] | |
| rowsMask0, colsMask0 = np.where(Mask > 0) | |
| minColIndex0, maxColIndex0 = np.argmin(colsMask0), np.argmax(colsMask0) | |
| minCol, maxCol = colsMask0[minColIndex0], colsMask0[maxColIndex0] | |
| minRowIndex0, maxRowIndex0 = np.argmin(rowsMask0), np.argmax(rowsMask0) | |
| minRow, maxRow = rowsMask0[minRowIndex0], rowsMask0[maxRowIndex0] | |
| upperLimit = np.maximum(0, minRow - 50) #20 | |
| lowerLimit = np.minimum(maxRow + 50, height) #20 | |
| leftLimit = np.maximum(0, minCol - 50) #lowerLimit = np.minimum(maxCol + 50, width) #20 | |
| rightLimit = np.minimum(maxCol + 50, width) | |
| if len(Image.shape) == 3: | |
| ImgCropped = Image[upperLimit:lowerLimit, leftLimit:rightLimit, :] | |
| MaskCropped = Mask[upperLimit:lowerLimit, leftLimit:rightLimit] | |
| ImgCropped[:20, :, :] = 0 | |
| ImgCropped[-20:, :, :] = 0 | |
| ImgCropped[:, :20, :] = 0 | |
| ImgCropped[:, -20:, :] = 0 | |
| MaskCropped[:20, :] = 0 | |
| MaskCropped[-20:, :] = 0 | |
| MaskCropped[:, :20] = 0 | |
| MaskCropped[:, -20:] = 0 | |
| elif len(Image.shape) == 2: | |
| ImgCropped = Image[upperLimit:lowerLimit, leftLimit:rightLimit] | |
| MaskCropped = Mask[upperLimit:lowerLimit, leftLimit:rightLimit] | |
| ImgCropped[:20, :] = 0 | |
| ImgCropped[-20:, :] = 0 | |
| ImgCropped[:, :20] = 0 | |
| ImgCropped[:, -20:] = 0 | |
| MaskCropped[:20, :] = 0 | |
| MaskCropped[-20:, :] = 0 | |
| MaskCropped[:, :20] = 0 | |
| MaskCropped[:, -20:] = 0 | |
| else: | |
| pass | |
| cropLimit = [upperLimit, lowerLimit, leftLimit, rightLimit] | |
| return ImgCropped, MaskCropped, cropLimit | |
| if __name__ == '__main__': | |
| if not os.path.exists(os.path.join('../data','AV_DRIVE','test','mask')): | |
| os.makedirs(os.path.join('../data','AV_DRIVE','test','mask')) | |
| for file in os.listdir(os.path.join('../data','AV_DRIVE','test','images')): | |
| # suffix file name | |
| if file.endswith('.jpg') or file.endswith('.png'): | |
| # read image | |
| img = cv2.imread(os.path.join('../data','AV_DRIVE','test','images',file)) | |
| _,mask = creatMask(img) | |
| # save mask | |
| cv2.imwrite(os.path.join('../data','AV_DRIVE','test','mask',file),mask) |