Spaces:
Runtime error
Runtime error
# -*- coding: utf-8 -*- | |
""" | |
Created on Mon Oct 3 16:09:11 2022 | |
@author: jpeeples | |
""" | |
import cv2 | |
from skimage.filters import threshold_li | |
from skimage.morphology import (erosion, dilation, opening, closing, # noqa | |
white_tophat) | |
import matplotlib.pyplot as plt | |
import numpy as np | |
from sklearn.decomposition import PCA | |
from sklearn.preprocessing import MinMaxScaler | |
def CCA_Preprocess(composite_img, k=2): | |
#Use pca to reduce vector | |
reshaped_composite_img = np.reshape(composite_img,(-1,3)) | |
#Apply PCA | |
pca = PCA(n_components=1, whiten=True) | |
gray_vector = pca.fit_transform(reshaped_composite_img) | |
#Visualize image | |
gray_img = np.reshape(gray_vector,(512,512)) | |
#Normalize and scale between 0 and 255 (inclusive) | |
scaler = MinMaxScaler(feature_range=(0, 1)) | |
scaler.fit(gray_img) | |
gray_img = scaler.transform(gray_img) | |
# Applying 7x7 Gaussian Blur | |
blurred = cv2.GaussianBlur(np.uint8(gray_img*255), (5, 5), 0) | |
#Sharpen Image | |
kernel3 = np.array([[0, -1, 0], | |
[-1, 5, -1], | |
[0, -1, 0]]) | |
blurred = cv2.filter2D(src=blurred, ddepth=-1, kernel=kernel3) | |
# #Threshold image from background for CCA | |
thresh = threshold_li(gray_img) | |
binary = gray_img > thresh | |
# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 400)) | |
# Mask = cv2.erode(np.uint8(binary*255), kernel) | |
# # Expand the mask in the vertical direction | |
# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 400)) | |
# Mask = cv2.dilate(Mask, kernel) | |
# # Erase the connection by placing zeros | |
# binary[np.where(Mask != 0)] = 0 | |
img = np.repeat(np.expand_dims(binary * gray_img, axis = -1), 3, axis=-1) | |
# Applying threshold | |
threshold = np.uint8(binary*255) | |
# Apply the Component analysis function | |
analysis = cv2.connectedComponentsWithStats(threshold, | |
4, | |
cv2.CV_32S) | |
(totalLabels, label_ids, values, centroid) = analysis | |
# Initialize a new image to | |
# store all the output components | |
output = np.zeros(gray_img.shape, dtype="uint8") | |
# Loop through each component | |
for i in range(1, totalLabels): | |
# if (area > 10000) and (area < 50000): | |
if i in np.argsort(values[:,4])[-k:]: | |
# Create a new image for bounding boxes | |
new_img=img.copy() | |
# Now extract the coordinate points | |
x1 = values[i, cv2.CC_STAT_LEFT] | |
y1 = values[i, cv2.CC_STAT_TOP] | |
w = values[i, cv2.CC_STAT_WIDTH] | |
h = values[i, cv2.CC_STAT_HEIGHT] | |
# Coordinate of the bounding box | |
pt1 = (x1, y1) | |
pt2 = (x1+ w, y1+ h) | |
(X, Y) = centroid[i] | |
# Bounding boxes for each component | |
cv2.rectangle(new_img,pt1,pt2, | |
(0, 255, 0), 3) | |
cv2.circle(new_img, (int(X), | |
int(Y)), | |
4, (0, 0, 255), -1) | |
# Create a new array to show individual component | |
component = np.zeros(gray_img.shape, dtype="uint8") | |
componentMask = (label_ids == i).astype("uint8") * 255 | |
# Apply the mask using the bitwise operator | |
component = cv2.bitwise_or(component,componentMask) | |
output = cv2.bitwise_or(output, componentMask) | |
# fig, axes = plt.subplots(ncols=3, figsize=(8, 2.5)) | |
# ax = axes.ravel() | |
# ax[0] = plt.subplot(1, 3, 1) | |
# ax[1] = plt.subplot(1, 3, 2, sharex=ax[0], sharey=ax[0]) | |
# ax[2] = plt.subplot(1, 3, 3, sharex=ax[0], sharey=ax[0]) | |
# # ax[3] = plt.subplot(1,4,4,sharex=ax[0], sharey=ax[0]) | |
# ax[0].imshow(gray_img, cmap='BuGn') | |
# ax[0].set_title('Original') | |
# ax[0].axis('off') | |
# ax[1].imshow(output, cmap='BuGn') | |
# ax[1].set_title('Connected Components') | |
# ax[1].axis('off') | |
# ax[2].imshow(gray_img*(output/255), cmap='BuGn') | |
# ax[2].set_title('ROI') | |
# ax[2].axis('off') | |
# plt.suptitle(title) | |
# plt.tight_layout() | |
# fig.savefig('{}/Img_{}.png'.format(folder,img_index)) | |
# plt.close() | |
#Return gray image and mask | |
return gray_img, output/255 |