图像处理第二次试验-裁剪图像

医学图像预处理 1)搭建运行环境,运行Brain Tumor Detection代码中裁剪功能 预先安装好相关模块,安装Jupyter Notebook交互式计算环境 conda install jupyter 首先导入相关包 import tensorflow as tf from tensorflow.keras.layers import Conv2D, Input, ZeroPadding2D, BatchNormalization, Activation, MaxPooling2D, Flatten, Dense from tensorflow.keras.models import Model, load_model from tensorflow.keras.callbacks import TensorBoard, ModelCheckpoint from sklearn.model_selection import train_test_split from sklearn.metrics import f1_score from sklearn.utils import shuffle import cv2 import imutils import numpy as np import matplotlib.pyplot as plt import time from os import listdir %matplotlib inline 因为这里只是进行图形预处理,对Brain Tumor图片进行裁剪,主要用到的包是cv2, imutils, numpy, matplotlib.pyplot 然后是运行定义裁剪脑轮廓(查找大脑的顶部、底部、左端、右端的极点)的函数(crop_brain_contour) def crop_brain_contour(image, plot=False): #import imutils #import cv2 #from matplotlib import pyplot as plt # Convert the image to grayscale, and blur it slightly gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (5, 5), 0) # Threshold the image, then perform a series of erosions + # dilations to remove any small regions of noise thresh = cv2.threshold(gray, 45, 255, cv2.THRESH_BINARY)[1] thresh = cv2.erode(thresh, None, iterations=2) thresh = cv2.dilate(thresh, None, iterations=2) # Find contours in thresholded image, then grab the largest one cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours(cnts) c = max(cnts, key=cv2.contourArea) # Find the extreme points extLeft = tuple(c[c[:, :, 0].argmin()][0]) extRight = tuple(c[c[:, :, 0].argmax()][0]) extTop = tuple(c[c[:, :, 1].argmin()][0]) extBot = tuple(c[c[:, :, 1].argmax()][0]) # crop new image out of the original image using the four extreme points (left, right, top, bottom) new_image = image[extTop[1]:extBot[1], extLeft[0]:extRight[0]] if plot: plt.figure() plt.subplot(1, 2, 1) plt.imshow(image) plt.tick_params(axis='both', which='both', top=False, bottom=False, left=False, right=False, labelbottom=False, labeltop=False, labelleft=False, labelright=False) plt.title('Original Image') plt.subplot(1, 2, 2) plt.imshow(new_image) plt.tick_params(axis='both', which='both', top=False, bottom=False, left=False, right=False, labelbottom=False, labeltop=False, labelleft=False, labelright=False) plt.title('Cropped Image') plt.show() return new_image 下面我简单说一下我对这个函数的理解(当然函数中已有原作者的解释): ...

March 22, 2021 · 3 min · Loyio Hex

图像处理第一次实验-初识CV

1.jpg 2.jpg 1.对1.jpg 分别作灰度化, 模糊化处理. 代码如下 """ @Project: imageProcessing @Author: loyio @Date: 3/20/21 """ from PIL import Image, ImageFilter if __name__ == '__main__': # greyscale imgfileOne = "Sample/1" sample_img = Image.open(imgfileOne+".jpg").convert('L') sample_img.save(imgfileOne+"_processed_gray.jpg") # Blur # sample_img = Image.open(imgfileOne+".jpg").filter(ImageFilter.BLUR) sample_img = Image.open(imgfileOne+".jpg").filter(ImageFilter.BoxBlur(5)) sample_img.save(imgfileOne + "_processed_blur.jpg") 图片效果如下 灰度处理 模糊处理 2.对2.jpg生成手绘效果 代码如下 """ @Project: imageProcessing @Author: loyio @Date: 3/20/21 """ from PIL import Image, ImageFilter import numpy as np if __name__ == '__main__': # Paint imgfileTwo = "Sample/2" sample_img_ary = np.asarray(Image.open(imgfileTwo+".jpg").convert('L')).astype('float') depth = 10. grad_x, grad_y = np.gradient(sample_img_ary) grad_x = grad_x * depth / 100. grad_y = grad_y * depth / 100. A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.) uni_x = grad_x / A uni_y = grad_y / A uni_z = 1. / A vec_el = np.pi / 2.2 vec_az = np.pi / 4. dx = np.cos(vec_el) * np.cos(vec_az) dy = np.cos(vec_el) * np.sin(vec_az) dz = np.sin(vec_el) sample_processed_ary = (255 * (dx*uni_x + dy*uni_y + dz*uni_z)).clip(0, 255) im = Image.fromarray(sample_processed_ary.astype('uint8')) im.save(imgfileTwo+"_processed_handpaint.jpg") 首先将图片灰度化,然后转换为float类型,存放在numpy array中 通过np.gradient求灰度图像的梯度(即灰度的变化率),将其赋值给grad_x, grad_y ,并根据深度级别计算新的梯度,同时归一化。将其控制在(0,1) 为x,y轴梯度构建三维归一化单位坐标系。 建立光源效果,可以将np.cos(vec_el)分析为单位射线在地平面上的投影长度。 dx,dy和dz是光源在x / y / z方向上的影响。 梯度与光源相互作用,最终将梯度转换为灰度。即sample_processed_ary = 255 * (dx*uni_x + dy*uni_y + dz*uni_z) 为避免越过边界,最后还要调用函数.clip(0,255) 图片效果如下 ...

March 20, 2021 · 1 min · Loyio Hex