mirror of
https://github.com/NanjingForestryUniversity/supermachine--tomato-passion_fruit.git
synced 2025-11-08 22:34:00 +00:00
445 lines
12 KiB
Plaintext
445 lines
12 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "initial_id",
|
|
"metadata": {
|
|
"collapsed": true,
|
|
"ExecuteTime": {
|
|
"end_time": "2024-04-10T14:49:51.025756600Z",
|
|
"start_time": "2024-04-10T14:49:51.021739700Z"
|
|
}
|
|
},
|
|
"source": [],
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
" import cv2\n",
|
|
" import numpy as np\n",
|
|
" import matplotlib.pyplot as plt\n",
|
|
" image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\TopImage_32.jpg')\n",
|
|
" r_channel = image[:, :, 2]\n",
|
|
" b_channel = image[:, :, 0]\n",
|
|
" gray_image = r_channel - b_channel\n",
|
|
" gray_image = np.clip(gray_image, 0, 255)\n",
|
|
" gray_image = np.uint8(gray_image)\n",
|
|
"\n",
|
|
" # 显示新生成的灰度图像\n",
|
|
" plt.imshow(gray_image, cmap='gray')\n",
|
|
" plt.axis('off')\n",
|
|
" plt.show()\n",
|
|
" "
|
|
],
|
|
"metadata": {
|
|
"collapsed": false,
|
|
"ExecuteTime": {
|
|
"end_time": "2024-04-10T14:53:49.016762Z",
|
|
"start_time": "2024-04-10T14:53:48.426912500Z"
|
|
}
|
|
},
|
|
"id": "206810a054630770",
|
|
"execution_count": 3,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"import cv2\n",
|
|
"import numpy as np\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"\n",
|
|
"# 读取RGB图像\n",
|
|
"img = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\TopImage_32.jpg')\n",
|
|
"\n",
|
|
"\n",
|
|
"# 获取图像的高度和宽度\n",
|
|
"height, width, _ = img.shape\n",
|
|
"\n",
|
|
"# 创建一个新的灰度图像\n",
|
|
"gray_img = np.zeros((height, width), dtype=np.uint8)\n",
|
|
"\n",
|
|
"# 遍历每个像素,计算R-B作为新的灰度值\n",
|
|
"for y in range(height):\n",
|
|
" for x in range(width):\n",
|
|
" r, g, b = img[y, x]\n",
|
|
" gray_value = r - b\n",
|
|
" if gray_value < 0:\n",
|
|
" gray_value = 0\n",
|
|
" elif gray_value > 255:\n",
|
|
" gray_value = 255\n",
|
|
" gray_img[y, x] = int(gray_value)\n",
|
|
"\n",
|
|
"\n",
|
|
"plt.imshow(gray_image, cmap='gray')\n",
|
|
"plt.axis('off')\n",
|
|
"plt.show()\n",
|
|
" \n",
|
|
"# 保存灰度图像\n",
|
|
"# cv2.imwrite('output_image.jpg', gray_img)"
|
|
],
|
|
"metadata": {
|
|
"collapsed": false,
|
|
"ExecuteTime": {
|
|
"end_time": "2024-04-10T15:04:30.607530400Z",
|
|
"start_time": "2024-04-10T15:03:55.344343200Z"
|
|
}
|
|
},
|
|
"id": "ba82f5c2fd049821",
|
|
"execution_count": 9,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"import torch\n",
|
|
"import cv2\n",
|
|
"import numpy as np\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"def extract_r_minus_b(image):\n",
|
|
" img_tensor = torch.tensor(image, dtype=torch.float32).to('cuda')\n",
|
|
"\n",
|
|
" r_channel = img_tensor[:, :, 0]\n",
|
|
" b_channel = img_tensor[:, :, 2]\n",
|
|
"\n",
|
|
" # 检查是否存在 NoneType 值,并将其替换为 0\n",
|
|
" r_channel = torch.nan_to_num(r_channel, nan=0)\n",
|
|
" b_channel = torch.nan_to_num(b_channel, nan=0)\n",
|
|
"\n",
|
|
" r_minus_b = torch.clamp(r_channel - b_channel, 0, 255).to('cpu').numpy().astype(np.uint8)\n",
|
|
"\n",
|
|
" return r_minus_b\n",
|
|
"\n",
|
|
"# 测试图像路径\n",
|
|
"image_path = '20240410tomatoRGBtest2/data/39.bmp'\n",
|
|
"\n",
|
|
"# 读取图像\n",
|
|
"image = cv2.imread(image_path)\n",
|
|
"\n",
|
|
"# 测试 extract_r_minus_b() 函数\n",
|
|
"r_minus_b = extract_r_minus_b(image)\n",
|
|
"\n",
|
|
"# 显示结果\n",
|
|
"plt.imshow(r_minus_b, cmap='gray')\n",
|
|
"plt.title('R-B Channel Difference')\n",
|
|
"plt.axis('off')\n",
|
|
"plt.show()\n"
|
|
],
|
|
"metadata": {
|
|
"collapsed": false,
|
|
"ExecuteTime": {
|
|
"end_time": "2024-04-10T16:01:24.857246200Z",
|
|
"start_time": "2024-04-10T16:01:24.805385100Z"
|
|
}
|
|
},
|
|
"id": "7f09896cca12ec80",
|
|
"execution_count": 15,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"### 自适应阈值分割\n",
|
|
"import cv2\n",
|
|
"import numpy as np\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"# 读取R通道减去B通道的灰度图\n",
|
|
"gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n",
|
|
"\n",
|
|
"# 自适应阈值分割\n",
|
|
"adaptive_threshold = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)\n",
|
|
"\n",
|
|
"# 显示结果\n",
|
|
"plt.imshow(adaptive_threshold, cmap='gray')\n",
|
|
"plt.axis('off')\n",
|
|
"plt.show()\n"
|
|
],
|
|
"metadata": {
|
|
"collapsed": false,
|
|
"ExecuteTime": {
|
|
"end_time": "2024-04-10T14:49:51.023762Z",
|
|
"start_time": "2024-04-10T14:49:47.876441200Z"
|
|
}
|
|
},
|
|
"id": "b9a2db758d89860e",
|
|
"execution_count": 1,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"### 带滑动条调节的阈值分割\n",
|
|
"\n",
|
|
"import cv2\n",
|
|
"import numpy as np\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"import ipywidgets as widgets\n",
|
|
"from IPython.display import display\n",
|
|
"\n",
|
|
"# 读取R通道减去B通道的灰度图\n",
|
|
"gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n",
|
|
"\n",
|
|
"# 定义回调函数\n",
|
|
"def threshold_callback(threshold):\n",
|
|
" _, thresholded_image = cv2.threshold(gray_image, threshold, 255, cv2.THRESH_BINARY)\n",
|
|
" plt.imshow(thresholded_image, cmap='gray')\n",
|
|
" plt.axis('off')\n",
|
|
" plt.show()\n",
|
|
"\n",
|
|
"# 创建滑动条\n",
|
|
"threshold_slider = widgets.IntSlider(min=0, max=255, step=1, value=128, description='Threshold:')\n",
|
|
"display(threshold_slider)\n",
|
|
"\n",
|
|
"# 调用回调函数\n",
|
|
"threshold_callback(threshold_slider.value)\n",
|
|
"\n",
|
|
"# 连接滑动条和回调函数\n",
|
|
"widgets.interactive(threshold_callback, threshold=threshold_slider)\n"
|
|
],
|
|
"metadata": {
|
|
"collapsed": false,
|
|
"ExecuteTime": {
|
|
"end_time": "2024-04-10T09:49:57.666748700Z",
|
|
"start_time": "2024-04-10T09:49:56.140521900Z"
|
|
}
|
|
},
|
|
"id": "6ff8e4e22d034f53",
|
|
"execution_count": 7,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"### Otsu阈值分割\n",
|
|
"import cv2\n",
|
|
"import numpy as np\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"# 读取R通道减去B通道的灰度图\n",
|
|
"gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n",
|
|
"\n",
|
|
"# 使用Otsu阈值分割\n",
|
|
"_, otsu_threshold = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)\n",
|
|
"\n",
|
|
"# 显示结果\n",
|
|
"plt.imshow(otsu_threshold, cmap='gray')\n",
|
|
"plt.axis('off')\n",
|
|
"plt.show()\n"
|
|
],
|
|
"metadata": {
|
|
"collapsed": false,
|
|
"ExecuteTime": {
|
|
"end_time": "2024-04-10T09:54:09.077152500Z",
|
|
"start_time": "2024-04-10T09:54:08.502123300Z"
|
|
}
|
|
},
|
|
"id": "6207115686820296",
|
|
"execution_count": 8,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"### Sobel边缘检测\n",
|
|
"import cv2\n",
|
|
"import numpy as np\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"# 读取R通道减去B通道的灰度图\n",
|
|
"gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n",
|
|
"\n",
|
|
"# 使用Sobel边缘检测\n",
|
|
"sobel_x = cv2.Sobel(gray_image, cv2.CV_64F, 1, 0, ksize=5)\n",
|
|
"sobel_y = cv2.Sobel(gray_image, cv2.CV_64F, 0, 1, ksize=5)\n",
|
|
"edges = np.sqrt(sobel_x**2 + sobel_y**2)\n",
|
|
"\n",
|
|
"# 显示结果\n",
|
|
"plt.imshow(edges, cmap='gray')\n",
|
|
"plt.axis('off')\n",
|
|
"plt.show()\n"
|
|
],
|
|
"metadata": {
|
|
"collapsed": false,
|
|
"ExecuteTime": {
|
|
"end_time": "2024-04-10T09:55:13.525305800Z",
|
|
"start_time": "2024-04-10T09:55:12.652295600Z"
|
|
}
|
|
},
|
|
"id": "f3bd38e5e62cbd3c",
|
|
"execution_count": 9,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"### 形态学处理\n",
|
|
"import cv2\n",
|
|
"import numpy as np\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"# 读取R通道减去B通道的灰度图\n",
|
|
"gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n",
|
|
"\n",
|
|
"# 定义结构元素\n",
|
|
"kernel = np.ones((2,2),np.uint8)\n",
|
|
"\n",
|
|
"# 闭运算\n",
|
|
"closing = cv2.morphologyEx(gray_image, cv2.MORPH_CLOSE, kernel)\n",
|
|
"\n",
|
|
"# 显示结果\n",
|
|
"plt.imshow(closing, cmap='gray')\n",
|
|
"plt.axis('off')\n",
|
|
"plt.show()\n"
|
|
],
|
|
"metadata": {
|
|
"collapsed": false,
|
|
"ExecuteTime": {
|
|
"end_time": "2024-04-10T09:57:05.878548800Z",
|
|
"start_time": "2024-04-10T09:57:05.060591800Z"
|
|
}
|
|
},
|
|
"id": "7395629910ee8620",
|
|
"execution_count": 11,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"### 角点检测\n",
|
|
"import cv2\n",
|
|
"import numpy as np\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"# 读取R通道减去B通道的灰度图\n",
|
|
"gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n",
|
|
"\n",
|
|
"# Shi-Tomasi角点检测\n",
|
|
"corners = cv2.goodFeaturesToTrack(gray_image, 100, 0.01, 10)\n",
|
|
"\n",
|
|
"# 绘制角点\n",
|
|
"corners = np.int0(corners)\n",
|
|
"for i in corners:\n",
|
|
" x, y = i.ravel()\n",
|
|
" cv2.circle(gray_image, (x, y), 3, 255, -1)\n",
|
|
"\n",
|
|
"# 显示结果\n",
|
|
"plt.imshow(gray_image, cmap='gray')\n",
|
|
"plt.axis('off')\n",
|
|
"plt.show()\n"
|
|
],
|
|
"metadata": {
|
|
"collapsed": false,
|
|
"ExecuteTime": {
|
|
"end_time": "2024-04-10T09:59:32.789829500Z",
|
|
"start_time": "2024-04-10T09:59:31.769444500Z"
|
|
}
|
|
},
|
|
"id": "990a0ecebe27d9a0",
|
|
"execution_count": 12,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"### 二值化对象\n",
|
|
"\n",
|
|
"import cv2\n",
|
|
"import numpy as np\n",
|
|
"\n",
|
|
"# 读取原始图像\n",
|
|
"img = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\output\\r_minus_b_26.jpg', cv2.IMREAD_GRAYSCALE)\n",
|
|
"\n",
|
|
"# 使用Otsu's二值化方法\n",
|
|
"_, binary_img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)\n",
|
|
"\n",
|
|
"# # 显示二值化后的图像\n",
|
|
"# cv2.imshow('Binary Image', binary_img)\n",
|
|
"# cv2.waitKey(0)\n",
|
|
"# cv2.destroyAllWindows()\n",
|
|
"# 保存二值化后的图像\n",
|
|
"cv2.imwrite('06.jpg', binary_img)"
|
|
],
|
|
"metadata": {
|
|
"collapsed": false,
|
|
"ExecuteTime": {
|
|
"end_time": "2024-04-12T06:34:26.530387300Z",
|
|
"start_time": "2024-04-12T06:34:26.132598800Z"
|
|
}
|
|
},
|
|
"id": "c4a6c0bfd05d3283",
|
|
"execution_count": 1,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"### 光滑边缘\n",
|
|
"import cv2\n",
|
|
"import numpy as np\n",
|
|
"\n",
|
|
"# 假设您的两张图像已经保存为 image1.png 和 image2.png\n",
|
|
"image1 = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\06.jpg', cv2.IMREAD_GRAYSCALE)\n",
|
|
"image2 = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\010.png', cv2.IMREAD_GRAYSCALE)\n",
|
|
"\n",
|
|
"# 应用高斯模糊来平滑边缘\n",
|
|
"smoothed_image1 = cv2.GaussianBlur(image1, (9, 9), 0)\n",
|
|
"smoothed_image2 = cv2.GaussianBlur(image2, (9, 9), 0)\n",
|
|
"\n",
|
|
"# 将处理后的图像转换为二值图像\n",
|
|
"_, binary_image1 = cv2.threshold(smoothed_image1, 128, 255, cv2.THRESH_BINARY)\n",
|
|
"_, binary_image2 = cv2.threshold(smoothed_image2, 128, 255, cv2.THRESH_BINARY)\n",
|
|
"\n",
|
|
"# 保存二值化后的图像\n",
|
|
"cv2.imwrite('smoothed_binary_image06.png', binary_image1)\n",
|
|
"cv2.imwrite('smoothed_binary_image2.png', binary_image2)"
|
|
],
|
|
"metadata": {
|
|
"collapsed": false,
|
|
"ExecuteTime": {
|
|
"end_time": "2024-04-12T06:35:18.063684900Z",
|
|
"start_time": "2024-04-12T06:35:17.935028900Z"
|
|
}
|
|
},
|
|
"id": "1f6ac60b3150fc9e",
|
|
"execution_count": 3,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [],
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"id": "3749d97ac3719946",
|
|
"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
|
|
}
|