img_copy[y:y + mask_height, x:x + mask_width] = 0
时间: 2024-04-03 14:34:28 浏览: 25
这段代码的作用是将图像中随机生成的矩形区域赋值为0,即黑色。其中,`img_copy`表示原始图像的一个副本,`y:y + mask_height`表示矩形区域在第一维度(即高度)上的起始和终止位置,`x:x + mask_width`表示矩形区域在第二维度(即宽度)上的起始和终止位置。将这个区域赋值为0,就相当于将这个区域的像素全部变成了黑色,即在原始图像上生成了一个黑色的矩形区域。
相关问题
t1 = time.time() # Note that compactness is defined differently because a grid is not used. Lower compactness for maskSLIC is equivalent segments = seg.slic(img, compactness=10, seed_type='nplace', mask=roi, n_segments=100, recompute_seeds=True, plot_examples=True, enforce_connectivity=True) print("Time: {:.2f} s".format(time.time() - t1)) for segment_id in np.unique(segments): mask = segments == segment_id masked_image = img.copy() masked_image[~mask] = 0 cv2.imwrite(r'I:\18Breakageratecalculation\mask-slic use\maskSLIC-master\result\result6\segment_{}.png'.format(segment_id), masked_image) plt.figure() plt.imshow(mark_boundaries(img, segments)) plt.contour(roi, contours=1, colors='red', linewidths=0.5) plt.axis('off') plt.savefig(r'I:\18Breakageratecalculation\mask-slic use\maskSLIC-master\result\result6\maskslic.png')提取每个子块图像的位置和大小信息
可以使用 `regionprops` 函数从分割结果中提取每个子块的位置和大小信息。具体步骤如下:
1. 将分割结果转换为标签图像,其中每个子块的像素值为其对应的标签值。
2. 使用 `regionprops` 函数提取标签图像中每个区域的属性信息,包括区域的位置、大小、像素值等。
3. 遍历所有区域,获取其位置和大小信息。
下面是示例代码:
```python
from skimage.measure import label, regionprops
# 将分割结果转换为标签图像
label_img = label(segments)
# 使用 regionprops 函数提取标签图像中每个区域的属性信息
props = regionprops(label_img)
# 遍历所有区域,获取其位置和大小信息
for prop in props:
# 获取区域的标签值、位置和大小信息
label_value = prop.label
bbox = prop.bbox # (min_row, min_col, max_row, max_col)
height = bbox[2] - bbox[0]
width = bbox[3] - bbox[1]
# 在原图上绘制该区域的边界框
cv2.rectangle(img, (bbox[1], bbox[0]), (bbox[3], bbox[2]), (0, 255, 0), 2)
# 输出该区域的位置和大小信息
print("Label: {}, Position: ({}, {}), Size: {} x {}".format(label_value, bbox[1], bbox[0], width, height))
```
其中,`bbox` 表示区域的最小外接矩形,其格式为 `(min_row, min_col, max_row, max_col)`,分别表示矩形左上角和右下角的行列坐标。`height` 和 `width` 分别表示矩形的高度和宽度。在实际使用中,可以根据需求选择输出或保存这些信息。
c++ 代码实现将下图代码的obj.seg渲染在image上,obj.seg是yolov8预测出来的mask图, cv::Mat image = cv::imread("inference/yq.jpg"); auto yolo = yolo::load("/home/zhangyu/tensorrt_code/test/1.18-integrate-full-yolov5/workspace/last.transd.trtmodel", yolo::Type::V8Seg); if (yolo == nullptr) return; auto objs = yolo->forward(cvimg(image)); int i = 0; for (auto &obj : objs) { uint8_t b, g, r; tie(b, g, r) = yolo::random_color(obj.class_label); cv::rectangle(image, cv::Point(obj.left, obj.top), cv::Point(obj.right, obj.bottom), cv::Scalar(b, g, r), 5); auto name = cocolabels[obj.class_label]; auto caption = cv::format("%s %.2f", name, obj.confidence); int width = cv::getTextSize(caption, 0, 1, 2, nullptr).width + 10; cv::rectangle(image, cv::Point(obj.left - 3, obj.top - 33), cv::Point(obj.left + width, obj.top), cv::Scalar(b, g, r), -1); cv::putText(image, caption, cv::Point(obj.left, obj.top - 5), 0, 1, cv::Scalar::all(0), 2, 16); if (obj.seg) { // cv::imwrite(cv::format("%d_mask.jpg", i), // cv::Mat(obj.seg->height, obj.seg->width, CV_8U, obj.seg->data)); i++; } } printf("Save result to Result.jpg, %d objects\n", (int)objs.size()); cv::imwrite("Result.jpg", image); }
要实现将 obj.seg 渲染在 image 上,可以按照以下步骤进行:
1. 将 obj.seg 转换成 cv::Mat 格式的图像,即将 obj.seg->data 拷贝到 cv::Mat 中,并设置其大小为 obj.seg->height 和 obj.seg->width。
2. 将 obj.seg 的像素值中为 1 的部分渲染成指定颜色的矩形框。
代码实现如下:
```c++
cv::Mat image = cv::imread("inference/yq.jpg");
auto yolo = yolo::load("/home/zhangyu/tensorrt_code/test/1.18-integrate-full-yolov5/workspace/last.transd.trtmodel", yolo::Type::V8Seg);
if (yolo == nullptr) return;
auto objs = yolo->forward(cvimg(image));
int i = 0;
for (auto &obj : objs) {
uint8_t b, g, r;
tie(b, g, r) = yolo::random_color(obj.class_label);
cv::rectangle(image, cv::Point(obj.left, obj.top), cv::Point(obj.right, obj.bottom),
cv::Scalar(b, g, r), 5);
auto name = cocolabels[obj.class_label];
auto caption = cv::format("%s %.2f", name, obj.confidence);
int width = cv::getTextSize(caption, 0, 1, 2, nullptr).width + 10;
cv::rectangle(image, cv::Point(obj.left - 3, obj.top - 33),
cv::Point(obj.left + width, obj.top), cv::Scalar(b, g, r), -1);
cv::putText(image, caption, cv::Point(obj.left, obj.top - 5), 0, 1, cv::Scalar::all(0), 2, 16);
if (obj.seg) {
cv::Mat seg_image(obj.seg->height, obj.seg->width, CV_8U, obj.seg->data);
cv::Mat seg_color;
cv::cvtColor(seg_image, seg_color, cv::COLOR_GRAY2BGR);
cv::Vec3b color(b, g, r);
seg_color.setTo(color, seg_image == 1);
cv::Rect seg_rect(obj.left, obj.top, obj.right - obj.left, obj.bottom - obj.top);
seg_color.copyTo(image(seg_rect));
i++;
}
}
printf("Save result to Result.jpg, %d objects\n", (int)objs.size());
cv::imwrite("Result.jpg", image);
```
其中,将 obj.seg 转换成 cv::Mat 格式的图像使用了以下代码:
```c++
cv::Mat seg_image(obj.seg->height, obj.seg->width, CV_8U, obj.seg->data);
```
将 obj.seg 的像素值中为 1 的部分渲染成指定颜色的矩形框使用了以下代码:
```c++
cv::Mat seg_color;
cv::cvtColor(seg_image, seg_color, cv::COLOR_GRAY2BGR);
cv::Vec3b color(b, g, r);
seg_color.setTo(color, seg_image == 1);
cv::Rect seg_rect(obj.left, obj.top, obj.right - obj.left, obj.bottom - obj.top);
seg_color.copyTo(image(seg_rect));
```
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)