API文档地址
基础
imgfill = np.zeros((H, W), dtype=np.uint8) #创建图像格式的空白图片
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #色彩转换
entr_img = cv2.cvtColor(entr_img,cv2.COLOR_GRAY2BGR)
常用
#边缘检测 sobel
x = cv2.Sobel(image, cv2.CV_16S, 1, 0)
y = cv2.Sobel(image, cv2.CV_16S, 0, 1)
absX = cv2.convertScaleAbs(x) # 转回unit8
absY = cv2.convertScaleAbs(y)
dst = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
#scharr
x = cv2.Scharr(image, cv2.CV_16S, 1, 0)
y = cv2.Scharr(image, cv2.CV_16S, 0, 1)
absX = cv2.convertScaleAbs(x) # 转回unit8
absY = cv2.convertScaleAbs(y)
dst = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
# Prewitt算子
kernelx = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int)
kernely = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=int)
x = cv2.filter2D(image, cv2.CV_16S, kernelx)
y = cv2.filter2D(image, cv2.CV_16S, kernely)
absX = cv2.convertScaleAbs(x)# 转uint8
absY = cv2.convertScaleAbs(y)
dst = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
#Laplacian
dst = cv2.Laplacian(image, cv2.CV_16S, ksize=3)
dst = cv2.convertScaleAbs(dst)
#锐化
kennel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32) # 锐化操作,试图向更立体
dst = cv2.filter2D(dst, -1, kennel)
#高斯双边
dst=cv2.bilateralFilter(src=image,d=0,sigmaColor=100,sigmaSpace=15)# img, 邻域直径,空间高斯函数标准差,灰度值相似性高斯函数标准差
#膨胀腐蚀
kernel = np.ones((3, 3), np.uint8)
img = cv2.dilate(img, kernel, iterations=1)
kernel = np.ones((2, 2), np.uint8)
img = cv2.erode(img, kernel, iterations=1)
#画点
cv2.circle(img, (cX, cY), 1, (0, 0, 255), -1)
PLT获取信息熵,并保存
#示例
#https://scikit-image.org/docs/0.14.x/auto_examples/filters/plot_entropy.html#sphx-glr-auto-examples-filters-plot-entropy-py
轮廓内区域填充
import cv2,os
from skimage import data,color,morphology,feature
from matplotlib import pyplot as plt
src = 'img/Troi/'
src1 = 'img/contours/'
dst = 'img/liquidFill/'
list = os.listdir(src1)
for i in list:
# print(i)
# if i == 'img9index14.jpg':
imgs = cv2.imread(src+i,0)
H, W = imgs.shape
img = cv2.imread(src1+i,0)
img = cv2.resize(img,(W,H))
H, W = img.shape
edgs=feature.canny(img, sigma=3, low_threshold=10, high_threshold=50)
chull = morphology.convex_hull_object(edgs)
print(chull)
#绘制轮廓
fig, axes = plt.subplots(1,2,figsize=(8,8))
ax0, ax1= axes.ravel()
ax0.imshow(edgs,plt.cm.gray)
ax0.set_title('many objects')
ax1.imshow(chull,plt.cm.gray)
ax1.set_title('convex_hull image')
plt.show()
泛洪算法填充
cv2.floodFill(img, mask, seed, newvalue(BGR), (loDiff1,loDiff2,loDiff3), (upDiff1,upDiff2,upDiff3), flag)
img:为待使用泛洪算法的图像
mask:为掩码层,使用掩码可以规定是在哪个区域使用该算法,如果是对于完整图像都要使用,则掩码层大小为原图行数+2,列数+2.是一个二维的0矩阵,边缘一圈会在使用算法是置为1。而只有对于掩码层上对应为0的位置才能泛洪,所以掩码层初始化为0矩阵。【dtype:np.uint8】
seed:为泛洪算法的种子点,也是根据该点的像素判断决定和其相近颜色的像素点,是否被泛洪处理。
newvalue:是对于泛洪区域新赋的值(B,G,R)
(loDiff1,loDiff2,loDiff3):是相对于seed种子点像素可以往下的像素值,即seed(B0,G0,R0),泛洪区域下界为(B0-loDiff1,G0-loDiff2,R0-loDiff3)
(upDiff1,upDiff2,upDiff3):是相对于seed种子点像素可以往上的像素值,即seed(B0,G0,R0),泛洪区域上界为(B0+upDiff1,G0+upDiff2,R0+upDiff3)
flag:为泛洪算法的处理模式。
#根据边缘填充获取最终积液区域
import cv2,os
from skimage import data,color,morphology,feature
from matplotlib import pyplot as plt
import numpy as np
src = 'img/2TRroi/'
src1 = 'img/cont/contours/'
dst = 'img/cont/liquid/'
list = os.listdir(src1)
for i in list:
print(i)
# if i == 'img9index14.jpg':
img1 = cv2.imread(src+i,0)
H, W = img1.shape
img = cv2.imread(src1+i,0)
img = cv2.resize(img,(W,H))
H, W = img.shape
mask = np.zeros([H+2, W+2], np.uint8)#新建图像矩阵 要原尺寸+2哦
cv2.floodFill(img, mask, (1,1), 255, 20, 150, cv2.FLOODFILL_FIXED_RANGE) #外部填充
img = cv2.bitwise_not(img) #反转像素
cv2.imwrite(dst+i,img)
边缘图像
结果图像
截图展示的,大小不一。。。