import numpy as np import matplotlib.pyplot as plt from matplotlib.image import imread  # Load image img = imread('')  # Convert to grayscale if it's a colored image if img.ndim == 3:     img = np.mean(img, axis=2)  # Apply FFT to the image fft_result = np.fft.fft2(img) fft_shift = np.fft.fftshift(fft_result)  # Define the thickness of the line thickness = 5  # Change this value to increase or decrease the line thickness  # Add a thick horizontal line at the center, avoiding the center point center_row = fft_shift.shape[0] // 2 center_col = fft_shift.shape[1] // 2  # Create a copy to avoid altering the center point fft_shift_with_line = np.copy(fft_shift)  # Zero out 'thickness' number of rows around the center row, except the center point for offset in range(-thickness // 2, thickness // 2 + 1):     fft_shift_with_line[center_row + offset, :] = 0  # Set the rows to zero     fft_shift_with_line[center_row + offset, center_col] = fft_shift[center_row + offset, center_col]  # Restore the center point  # Get the magnitude spectrum magnitude_spectrum = np.log(np.abs(fft_shift_with_line) + 1)  # Perform the inverse FFT ifft_shift = np.fft.ifftshift(fft_shift_with_line) img_reconstructed = np.fft.ifft2(ifft_shift) img_reconstructed = np.real(img_reconstructed)  # Take only the real part  # Plot the original, magnitude spectrum, and the reconstructed images plt.figure(figsize=(15, 5))  plt.subplot(1, 3, 1) plt.title("Original Image") plt.imshow(img, cmap='gray')  plt.subplot(1, 3, 2) plt.title("Magnitude Spectrum with Thick Line") plt.imshow(magnitude_spectrum, cmap='gray')  plt.subplot(1, 3, 3) plt.title("Reconstructed Image") plt.imshow(img_reconstructed, cmap='gray')  plt.show() ➜ this is the code for FFT and, import cv2 as cv from scipy.spatial import distance  # List to store the coordinates of clicked points points = []  # Conversion factors from pixels to micrometers for different grinding types conversion_factors = {     "R": 100 / 24,  # 100 µm / 24 pixels     "M": 100 / 69,  # 100 µm / 69 pixels     "F": 100 / 90   # 100 µm / 90 pixels }  # Function to find coordinates and calculate distance def find_coord(event, x, y, flags, params):     if event == cv.EVENT_LBUTTONDOWN:         # Print clicked coordinates         print(f"Clicked at: ({x}, {y})")                  # Append the new point to the points list         points.append((x, y))                  # Display clicked coordinates on the image         font = cv.FONT_HERSHEY_PLAIN         new_img = img.copy()  # Make a copy of the image to avoid overwriting text         cv.putText(new_img, f"{x},{y}", (x, y), font, 1, (255, 0, 0), 2)                  # Show the image with clicked coordinates         cv.imshow("image", new_img)                  # Check if two points have been clicked         if len(points) == 2:             pt1, pt2 = points                          # Draw a line between the two points             cv.line(new_img, pt1, pt2, (0, 255, 0), 2)  # Line in green with thickness 2                          # Calculate the Euclidean distance in pixels             dist_pixels = distance.euclidean(pt1, pt2)                          # Convert distance to micrometers using the selected conversion factor             dist_micrometers = dist_pixels * conversion_factor                          # Prepare the distance string             distance_text = (f"Distance: {dist_micrometers:.2f} µm")                          # Calculate the midpoint for the text position             mid_point = (int((pt1[0] + pt2[0]) / 2), int((pt1[1] + pt2[1]) / 2))  # Midpoint of the line                          # Draw the distance on the image at the mid point             cv.putText(new_img, distance_text, mid_point, font, 1, (255, 255, 255), 2, cv.LINE_AA)                          print(distance_text)                          # Show the image with the line and distance text             cv.imshow("image", new_img)                          # Clear points after drawing and calculating distance             points.clear()  if __name__ == "__main__":     # Read and display the image     img = cv.imread('/Users/abhi/Downloads/Fused Silica_Corning 7980/Sample 3_Fine.tif')          if img is None:         print("Error: Image not found.")     else:         # Prompt user to select grinding type         grinding_type = input("Select grinding type (R for Rough, M for Medium and F for Fine): ").strip().capitalize()                  # Validate user input         while grinding_type not in conversion_factors:             grinding_type = input("Invalid input. Select grinding type (Rough, Medium, Fine): ").strip().capitalize()                  # Set the conversion factor based on the selected grinding type         conversion_factor = conversion_factors[grinding_type]                  # Display the image         cv.imshow("image", img)                  # Set callback function         cv.setMouseCallback("image", find_coord)                  # Wait until a key is pressed         cv.waitKey(0)                  # Destroy all windows         cv.destroyAllWindows() ➜ this is the code for