supermachine--tomato-passio.../spectrum/03mask.ipynb
GG 828015c206 feat:新增百香果rgb部分代码;
refactor:重构部分代码逻辑
2024-06-04 22:51:02 +08:00

575 lines
19 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "code",
"execution_count": 4,
"id": "initial_id",
"metadata": {
"collapsed": true,
"ExecuteTime": {
"end_time": "2024-03-18T07:45:52.076766Z",
"start_time": "2024-03-18T07:45:52.061770Z"
}
},
"source": [
"import cv2\n",
"import numpy as np\n",
"import os"
],
"outputs": []
},
{
"cell_type": "code",
"execution_count": 44,
"source": [
"#读取图片\n",
"img = cv2.imread('datas/39.tiff')\n",
"hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)\n",
"cv2.imshow('HSV', hsv)\n",
"lower_red = np.array([10, 70, 70])\n",
"upper_red = np.array([255, 255, 255])\n",
"mask = cv2.inRange(hsv, lower_red, upper_red) #lower20===>0,upper200==>0,\n",
"#保存\n",
"cv2.imwrite('result/39.tiff', mask)"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-11-20T12:33:25.384530Z",
"start_time": "2023-11-20T12:33:25.353136100Z"
}
},
"id": "eba7a5b467780310",
"outputs": []
},
{
"cell_type": "code",
"execution_count": 56,
"source": [
"import cv2\n",
"import numpy as np\n",
"from matplotlib import pyplot as plt\n",
"\n",
"#通过OpenCV读取图片信息\n",
"img = cv2.imread('data/1.tiff')\n",
"# BGR图转为HSV\n",
"hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)\n",
"# 提取hsv中H通道数据\n",
"h = hsv[:, :, 0].ravel()\n",
"# 直方图显示\n",
"plt.hist(h, 180, [0, 180])\n",
"plt.show()\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-18T08:31:54.546425Z",
"start_time": "2024-03-18T08:31:54.363728Z"
}
},
"id": "14abba9e7d1d9496",
"outputs": []
},
{
"cell_type": "code",
"source": [
"#亮度增强\n",
"from PIL import Image, ImageEnhance\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# 打开图像\n",
"image = Image.open('data/new/yellow/1.tiff')\n",
"\n",
"# 亮度增强\n",
"enhancer = ImageEnhance.Brightness(image)\n",
"enhanced_image = enhancer.enhance(3) # 可以尝试不同的值以找到最佳效果\n",
"\n",
"# 显示图像\n",
"plt.imshow(enhanced_image)\n",
"plt.axis('off') # 关闭坐标轴\n",
"plt.show()\n",
"\n",
"# 如有需要,保存增强后的图像\n",
"enhanced_image.save('enhanced_image.png')\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-18T15:43:17.592593Z",
"start_time": "2024-03-18T15:43:17.520589Z"
}
},
"id": "4bde773e19fd521e",
"execution_count": 77,
"outputs": []
},
{
"cell_type": "code",
"execution_count": 78,
"source": [
"import cv2\n",
"import numpy as np\n",
"\n",
"#通过OpenCV读取图片信息\n",
"img = cv2.imread('enhanced_image.png')\n",
"hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)\n",
"cv2.imshow(\"img\", img)\n",
"\n",
"# HSV 的下界限\n",
"lower_red = np.array([133,50,50])\n",
"# HSV 的上界限\n",
"upper_red = np.array([179,255,255])\n",
"\n",
"# 通过上下限提取范围内的掩模mask\n",
"mask = cv2.inRange(hsv, lower_red, upper_red)\n",
"cv2.imshow(\"mask\", mask)\n",
"\n",
"# 腐蚀与膨胀处理\n",
"# 定义\n",
"kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(2, 2))#定义结构元素的形状和大小\n",
"\n",
"openingmask = cv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernel) # 闭运算\n",
"openingmask1 = cv2.morphologyEx(openingmask, cv2.MORPH_OPEN,kernel) # 开运算\n",
"cv2.imshow('mask',openingmask)\n",
"cv2.imshow('mask1',openingmask1)\n",
"\n",
"cv2.waitKey(0)\n",
"cv2.destroyAllWindows()\n",
"\n",
"\n",
"# 找出所有白色连通区域\n",
"num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(openingmask1, 4, cv2.CV_32S)\n",
"\n",
"# 遍历所有连通区域,移除面积小于特定阈值的区域\n",
"area_threshold = 10 # 可以根据实际情况调整阈值大小\n",
"for i in range(1, num_labels): # 标签0是背景\n",
" if stats[i, cv2.CC_STAT_AREA] < area_threshold:\n",
" openingmask1[labels == i] = 0\n",
"\n",
"# 保存和显示处理后的掩膜\n",
"cv2.imwrite('cleaned_mask.png', openingmask1)\n",
"cv2.imshow('Cleaned Mask', openingmask1)\n",
"cv2.waitKey(0)\n",
"cv2.destroyAllWindows()\n",
"\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-18T15:43:25.341649Z",
"start_time": "2024-03-18T15:43:19.273376Z"
}
},
"id": "a6e663957af72d33",
"outputs": []
},
{
"cell_type": "code",
"source": [],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-18T10:43:49.218155Z",
"start_time": "2024-03-18T10:43:26.620748Z"
}
},
"id": "7264359547e5d56f",
"execution_count": 25,
"outputs": []
},
{
"cell_type": "code",
"source": [
"#白色颜色带处理\n",
"\n",
"import cv2\n",
"import numpy as np\n",
"\n",
"# 加载图像\n",
"mask_path = 'mask1/new/empty/yellow/mask_1.png'\n",
"\n",
"\n",
"\n",
"\n",
"# 边缘去除函数\n",
"def remove_edge_bands(mask, edge_threshold=10):\n",
" h, w = mask.shape[:2]\n",
"\n",
" # 去除上下边缘区域\n",
" mask[:edge_threshold, :] = 0\n",
" mask[h-edge_threshold:, :] = 0\n",
"\n",
" return mask\n",
"\n",
"# 应用边缘去除\n",
"cleaned_mask = remove_edge_bands(mask)\n",
"\n",
"# 保存处理后的图像\n",
"output_path = '测试.png'\n",
"cv2.imwrite(output_path, cleaned_mask)\n",
"# 显示处理后的图像\n",
"cv2.imshow('Cleaned Mask ', cleaned_mask)\n",
"\n",
"cv2.waitKey(0)\n",
"cv2.destroyAllWindows()\n",
"\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-18T16:11:08.430381Z",
"start_time": "2024-03-18T16:11:04.710701Z"
}
},
"id": "9eedb7f708e43473",
"execution_count": 95,
"outputs": []
},
{
"cell_type": "code",
"source": [
"#实现利用hsv空间进行阈值分割要求hsv三个值做成滑动轴可拖动的实时显示当前阈值分割效果并且显示当前hsv三个的具体值\n",
"\n",
"import cv2\n",
"import numpy as np\n",
"\n",
"def nothing(x):\n",
" pass\n",
"\n",
"# 创建一个窗口\n",
"cv2.namedWindow('HSV Thresholding')\n",
"\n",
"# 创建滑动条用于调整HSV阈值\n",
"cv2.createTrackbar('H Lower', 'HSV Thresholding', 0, 179, nothing)\n",
"cv2.createTrackbar('H Upper', 'HSV Thresholding', 179, 179, nothing)\n",
"cv2.createTrackbar('S Lower', 'HSV Thresholding', 0, 255, nothing)\n",
"cv2.createTrackbar('S Upper', 'HSV Thresholding', 255, 255, nothing)\n",
"cv2.createTrackbar('V Lower', 'HSV Thresholding', 0, 255, nothing)\n",
"cv2.createTrackbar('V Upper', 'HSV Thresholding', 255, 255, nothing)\n",
"\n",
"# 读取图像\n",
"image = cv2.imread('enhanced_image.png')\n",
"\n",
"# 将BGR图像转换为HSV\n",
"hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)\n",
"\n",
"while True:\n",
" # 获取滑动条的当前位置\n",
" h_lower = cv2.getTrackbarPos('H Lower', 'HSV Thresholding')\n",
" h_upper = cv2.getTrackbarPos('H Upper', 'HSV Thresholding')\n",
" s_lower = cv2.getTrackbarPos('S Lower', 'HSV Thresholding')\n",
" s_upper = cv2.getTrackbarPos('S Upper', 'HSV Thresholding')\n",
" v_lower = cv2.getTrackbarPos('V Lower', 'HSV Thresholding')\n",
" v_upper = cv2.getTrackbarPos('V Upper', 'HSV Thresholding')\n",
"\n",
" # 创建HSV阈值掩膜\n",
" lower_bound = np.array([h_lower, s_lower, v_lower])\n",
" upper_bound = np.array([h_upper, s_upper, v_upper])\n",
" mask = cv2.inRange(hsv, lower_bound, upper_bound)\n",
"\n",
" # 对图像应用掩膜以获取结果\n",
" result = cv2.bitwise_and(image, image, mask=mask)\n",
"\n",
" # 显示图像\n",
" cv2.imshow('HSV Thresholding', result)\n",
"\n",
" # 打印当前HSV阈值\n",
" print(f\"H: ({h_lower}, {h_upper}), S: ({s_lower}, {s_upper}), V: ({v_lower}, {v_upper})\")\n",
"\n",
" # 按'q'键退出循环\n",
" if cv2.waitKey(1) & 0xFF == ord('q'):\n",
" break\n",
"\n",
"# 销毁所有窗口\n",
"cv2.destroyAllWindows()\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-18T15:39:44.463493Z",
"start_time": "2024-03-18T15:39:40.005484Z"
}
},
"id": "a42269b65f848794",
"execution_count": 70,
"outputs": []
},
{
"cell_type": "code",
"execution_count": 28,
"source": [
"##循环提取mask\n",
"\n",
"# 指定文件夹路径\n",
"folder_path = 'tcimage' # 替换成你的文件夹路径\n",
"\n",
"# 获取文件夹中的所有文件\n",
"files = os.listdir(folder_path)\n",
"\n",
"for file_name in files:\n",
" file_path = os.path.join(folder_path,file_name)\n",
"\n",
" img = cv2.imread(file_path)\n",
" \n",
" hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)\n",
"\n",
" # cv2.imshow(\"img\", img)\n",
"\n",
" # HSV 的下界限\n",
" lower_red = np.array([160,70,15])\n",
" # HSV 的上界限\n",
" upper_red = np.array([179,255,255])\n",
"\n",
" # 通过上下限提取范围内的掩模mask\n",
" mask = cv2.inRange(hsv, lower_red, upper_red)\n",
" # cv2.imshow(\"mask\", mask)\n",
" \n",
" # 腐蚀与膨胀处理\n",
" \n",
" kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(3, 3))#定义结构元素的形状和大小\n",
" openingmask = cv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernel) # 闭运算\n",
" openingmask1 = cv2.morphologyEx(openingmask, cv2.MORPH_OPEN,kernel) # 开运算\n",
" \n",
" # cv2.imshow('mask',openingmask)\n",
" # cv2.imshow('mask1',openingmask1)\n",
" # \n",
" # cv2.waitKey(0)\n",
" # cv2.destroyAllWindows()\n",
"\n",
" Img_Name = \"./mask/\" + file_name \n",
" cv2.imwrite(Img_Name, openingmask1)\n",
"\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-18T08:14:58.545492Z",
"start_time": "2024-03-18T08:14:58.534491Z"
}
},
"id": "3665c0b573adb358",
"outputs": []
},
{
"cell_type": "code",
"execution_count": 57,
"source": [
" #先增强图像亮度然后循环提取并保存mask20240318版无锡透射百香果ps:目前参数适用于old文件夹内图像new文件夹内图像需要调整参数\n",
"\n",
"import cv2\n",
"import numpy as np\n",
"import os\n",
"from PIL import Image, ImageEnhance\n",
"\n",
"# 消除边缘区域条状白色色带,实现仅包含中心果子区域为白色目标区域\n",
"# 边缘去除函数\n",
"def remove_edge_bands(mask, edge_threshold=8):\n",
" h, w = mask.shape[:2]\n",
"\n",
" # 去除上下边缘区域\n",
" mask[:edge_threshold+6, :] = 0\n",
" mask[h-edge_threshold:, :] = 0\n",
"\n",
" return mask\n",
"\n",
"\n",
"\n",
"\n",
"# 设定输入和输出文件夹路径\n",
"input_folder_path = 'data/new/green' # 替换为tiff图像的文件夹路径\n",
"output_folder_path = 'mask/new/green' # 替换为保存mask的文件夹路径\n",
"\n",
"# 检查输出文件夹是否存在,如果不存在就创建它\n",
"if not os.path.exists(output_folder_path):\n",
" os.makedirs(output_folder_path)\n",
"\n",
"# 遍历指定文件夹内的所有tiff文件\n",
"for file_name in os.listdir(input_folder_path):\n",
" if file_name.endswith('.tiff'):\n",
" # 构建完整的文件路径\n",
" file_path = os.path.join(input_folder_path, file_name)\n",
"\n",
" # 打开并增强图像亮度\n",
" image = Image.open(file_path)\n",
" enhancer = ImageEnhance.Brightness(image)\n",
" enhanced_image = enhancer.enhance(3.5) # 增强亮度\n",
" \n",
" # 将PIL图像转换为opencv图像\n",
" img = np.array(enhanced_image)\n",
" img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)\n",
"\n",
" # 转换到HSV空间\n",
" hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)\n",
"\n",
" # 设置HSV阈值\n",
" lower_red = np.array([133, 40, 43])\n",
" upper_red = np.array([179, 255, 255])\n",
"\n",
" # 提取掩膜\n",
" mask = cv2.inRange(hsv, lower_red, upper_red)\n",
"\n",
" # 腐蚀与膨胀处理\n",
" kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (2, 2))\n",
" openingmask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) # 闭运算\n",
" openingmask1 = cv2.morphologyEx(openingmask, cv2.MORPH_OPEN, kernel) # 开运算\n",
"\n",
" # 连通区域处理\n",
" num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(openingmask1, 4, cv2.CV_32S)\n",
" area_threshold = 30\n",
" for i in range(1, num_labels): # 标签0是背景\n",
" if stats[i, cv2.CC_STAT_AREA] < area_threshold:\n",
" openingmask1[labels == i] = 0\n",
" \n",
" # 应用边缘去除\n",
" cleaned_mask = remove_edge_bands(openingmask1)\n",
" \n",
" # 生成输出文件名和路径\n",
" output_file_name = 'mask_' + os.path.splitext(file_name)[0] + '.png'\n",
" output_file_path = os.path.join(output_folder_path, output_file_name)\n",
"\n",
" # 保存处理后的掩膜\n",
" cv2.imwrite(output_file_path, cleaned_mask)\n",
"\n",
"print(\"处理完成,掩膜图像已保存到指定文件夹。\")\n",
"\n",
"###原条光黄果p110顶端少1像素宽度图像原因在于后续图像过窄目前参数已是最优解选择手动替换p110"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-18T12:15:14.697171Z",
"start_time": "2024-03-18T12:15:14.164074Z"
}
},
"id": "ab7f303dfa7d8a27",
"outputs": []
},
{
"cell_type": "code",
"source": [
" #先增强图像亮度然后循环提取并保存mask20240318版无锡透射百香果ps:new文件夹内\n",
"\n",
"import cv2\n",
"import numpy as np\n",
"import os\n",
"from PIL import Image, ImageEnhance\n",
"\n",
"# 消除边缘区域条状白色色带,实现仅包含中心果子区域为白色目标区域\n",
"# 边缘去除函数\n",
"def remove_edge_bands(mask, edge_threshold=2):\n",
" h, w = mask.shape[:2]\n",
"\n",
" # 去除上下边缘区域\n",
" mask[:edge_threshold+18, :] = 0\n",
" mask[h-edge_threshold:, :] = 0\n",
"\n",
" return mask\n",
"\n",
"\n",
"\n",
"\n",
"# 设定输入和输出文件夹路径\n",
"input_folder_path = 'data/new/yellow' # 替换为tiff图像的文件夹路径\n",
"output_folder_path = 'mask/new/yellow' # 替换为保存mask的文件夹路径\n",
"\n",
"# 检查输出文件夹是否存在,如果不存在就创建它\n",
"if not os.path.exists(output_folder_path):\n",
" os.makedirs(output_folder_path)\n",
"\n",
"# 遍历指定文件夹内的所有tiff文件\n",
"for file_name in os.listdir(input_folder_path):\n",
" if file_name.endswith('.tiff'):\n",
" # 构建完整的文件路径\n",
" file_path = os.path.join(input_folder_path, file_name)\n",
"\n",
" # 打开并增强图像亮度\n",
" image = Image.open(file_path)\n",
" enhancer = ImageEnhance.Brightness(image)\n",
" enhanced_image = enhancer.enhance(3) # 增强亮度\n",
" \n",
" # 将PIL图像转换为opencv图像\n",
" img = np.array(enhanced_image)\n",
" img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)\n",
"\n",
" # 转换到HSV空间\n",
" hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)\n",
"\n",
" # 设置HSV阈值\n",
" lower_red = np.array([133, 50, 50])\n",
" upper_red = np.array([179, 255, 255])\n",
"\n",
" # 提取掩膜\n",
" mask = cv2.inRange(hsv, lower_red, upper_red)\n",
"\n",
" # 腐蚀与膨胀处理\n",
" kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (2, 2))\n",
" openingmask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) # 闭运算\n",
" openingmask1 = cv2.morphologyEx(openingmask, cv2.MORPH_OPEN, kernel) # 开运算\n",
"\n",
" # 连通区域处理\n",
" num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(openingmask1, 4, cv2.CV_32S)\n",
" area_threshold = 30\n",
" for i in range(1, num_labels): # 标签0是背景\n",
" if stats[i, cv2.CC_STAT_AREA] < area_threshold:\n",
" openingmask1[labels == i] = 0\n",
" \n",
" # 应用边缘去除\n",
" cleaned_mask = remove_edge_bands(openingmask1)\n",
" \n",
" # 生成输出文件名和路径\n",
" output_file_name = 'mask_' + os.path.splitext(file_name)[0] + '.png'\n",
" output_file_path = os.path.join(output_folder_path, output_file_name)\n",
"\n",
" # 保存处理后的掩膜\n",
" cv2.imwrite(output_file_path, cleaned_mask)\n",
"\n",
"print(\"处理完成,掩膜图像已保存到指定文件夹。\")\n",
"\n",
"###new当前参数黄果p62顶部白色区域过大当前参数下其他图像效果较好选择手动替换p62针对new下的yellow和green此时边缘参数宽度为5上边缘+7下边缘+5\n",
"###对于new下empty内的yellow边缘参数宽度为2上边缘+3下边缘+2,P1和p30效果不好p1上边缘没有去除干净p30上边缘去除过多选择手动替换"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-18T16:14:54.187480Z",
"start_time": "2024-03-18T16:14:53.736931Z"
}
},
"id": "6afa206f04690497",
"execution_count": 101,
"outputs": []
},
{
"cell_type": "code",
"source": [],
"metadata": {
"collapsed": false
},
"id": "bc021fb45388a2b3",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}