使用python实现Ibw = ~bwmorph(~I, 'thin', inf);
时间: 2023-11-28 12:06:42 浏览: 231
在python中,可以使用OpenCV库实现细化操作。具体代码如下:
```python
import cv2
import numpy as np
# 读取图像
img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)
# 对图像进行细化操作
img = cv2.bitwise_not(cv2.ximgproc.thinning(cv2.bitwise_not(img)))
# 显示处理后的图像
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
其中,cv2.bitwise_not()函数实现二值化图像的反转操作。cv2.ximgproc.thinning()函数实现细化操作,输入为反转后的图像。最后通过cv2.imshow()函数显示处理后的图像。
相关问题
% 设置图片文件夹路径 image_folder = 'C:\Users\断x\Pictures\zd'; % 读取文件夹中的所有图片 file_names = dir(fullfile(image_folder, '*.jpg')); num_images = length(file_names); % 定义数组保存结果 XX = zeros(1, num_images); YY = zeros(1, num_images); % 循环遍历每张图片并处理 for i = 1:num_images % 读取图片 image_name = file_names(i).name; image_path = fullfile(image_folder, image_name); image = imread(image_path); I= image; % 处理图片 %I1 = rgb2gray(I); I2 = imcomplement(I); thresh = graythresh(I2); I3 = im2bw(I2, thresh); Ibw = imfill(I3, 'holes'); Ilabel = bwlabel(Ibw); Area_I = regionprops(Ilabel, 'centroid'); % 绘制形心并保存结果 figure; imshow(image); hold on; for x = 1:numel(Area_I) plot(Area_I(x).Centroid(1), Area_I(x).Centroid(2), 'b*'); XX(1,i) = Area_I(x).Centroid(1); YY(1,i)= Area_I(x).Centroid(2); end hold off end % 计算位移和时间 if i > 1 displacement(1,i) = sqrt((XX(1,i)-XX(1,i-1))^2 + (YY(1,i)-YY(1,i-1))^2); time(1,i) = i-1; end加上画出位移图和加速度图的代码
代码如下:
% 设置图片文件夹路径
image_folder = 'C:\Users\断x\Pictures\zd';
% 读取文件夹中的所有图片
file_names = dir(fullfile(image_folder, '*.jpg'));
num_images = length(file_names);
% 定义数组保存结果
XX = zeros(1, num_images);
YY = zeros(1, num_images);
displacement = zeros(1, num_images);
time = zeros(1, num_images);
% 循环遍历每张图片并处理
for i = 1:num_images
% 读取图片
image_name = file_names(i).name;
image_path = fullfile(image_folder, image_name);
image = imread(image_path);
I = image;
% 处理图片
I2 = imcomplement(I);
thresh = graythresh(I2);
I3 = im2bw(I2, thresh);
Ibw = imfill(I3, 'holes');
Ilabel = bwlabel(Ibw);
Area_I = regionprops(Ilabel, 'centroid');
% 绘制形心并保存结果
figure; imshow(image);
hold on;
for x = 1:numel(Area_I)
plot(Area_I(x).Centroid(1), Area_I(x).Centroid(2), 'b*');
XX(1,i) = Area_I(x).Centroid(1);
YY(1,i) = Area_I(x).Centroid(2);
end
hold off
% 计算位移和时间
if i > 1
displacement(1,i) = sqrt((XX(1,i)-XX(1,i-1))^2 + (YY(1,i)-YY(1,i-1))^2);
time(1,i) = i-1;
end
end
% 画出位移图
figure;
plot(time, displacement);
title('Displacement vs Time');
xlabel('Time');
ylabel('Displacement');
% 计算加速度并画出加速度图
velocity = displacement./time;
acceleration = (velocity(2:end)-velocity(1:end-1))./(time(2:end)-time(1:end-1));
figure;
plot(time(2:end), acceleration);
title('Acceleration vs Time');
xlabel('Time');
ylabel('Acceleration');
指出下面代码的问题image_folder = 'D:\Data\20230527\try'; file_names = dir(fullfile(image_folder, '*.jpg')); num_images = length(file_names); for i =1:num_images image_name = file_names(i).name; image_path = fullfile(image_folder, image_name); image = imread(image_path); I=image; %I=imread('000001.jpg');%读取 %imfinfo('000001.jpg');%获取图片信息 %I1=rgb2gray(I);%转为灰度图 I2=imcomplement(I);%取反 thresh=graythresh(I2);%自动确定阈值 I3=im2bw(I2,thresh);%对图像二值化 %imshow(I3);%显示图片 Ibw=imfill(I3,'holes');%该西效用于埃充图像区城和“空域, Ilabel = bwlabel(Ibw);%连通区域标记西效 Area_I = regionprops(Ilabel,'centroid');%用来度量图像区域属性的西数,常用来统计被标记的区城的面积夕 figure; imshow(I);hold on;%显示原始图像% 将形心标记于图像上并品示 for x = 1: numel (Area_I) plot (Area_I(x) . Centroid (1),Area_I(x).Centroid(2),'b*'); point_xy(1,x)=Area_I(x).Centroid(1); point_xy(2,x)=Area_I(x).Centroid(2); end point_xy; XX=[];YY=[]; XX(1,i)=point_xy(1,x); YY(1,i)=point_xy(2,x); end
这段代码存在以下问题:
1. 在循环内部定义了 `XX` 和 `YY` 数组,但是每次循环都重新定义为一个长度为1的数组,因此每次循环都会清空之前的数据,最终的结果只包含了最后一张图片的数据。应该在循环外部定义数组,并在循环内部将每张图片的数据添加到数组中。
2. `XX` 和 `YY` 数组的索引应该是 `i`,而不是 `1`,因为 `i` 表示当前循环的图片序号。
3. 在 `for` 循环的最后一行,没有加上 `hold off` 命令,可能导致后面的图片覆盖前面的图片。
4. 在使用 `imcomplement` 函数将图像取反之前,应该先将彩色图像转换为灰度图像,否则会出现错误。
下面是修改后的代码:
```matlab
% 设置图片文件夹路径
image_folder = 'D:\Data\20230527\try';
% 读取文件夹中的所有图片
file_names = dir(fullfile(image_folder, '*.jpg'));
num_images = length(file_names);
% 定义数组保存结果
XX = zeros(1, num_images);
YY = zeros(1, num_images);
% 循环遍历每张图片并处理
for i = 1:num_images
% 读取图片
image_name = file_names(i).name;
image_path = fullfile(image_folder, image_name);
image = imread(image_path);
% 处理图片
I = rgb2gray(image);
I2 = imcomplement(I);
thresh = graythresh(I2);
I3 = im2bw(I2, thresh);
Ibw = imfill(I3, 'holes');
Ilabel = bwlabel(Ibw);
Area_I = regionprops(Ilabel, 'centroid');
% 绘制形心并保存结果
figure;
imshow(image);
hold on;
for x = 1:numel(Area_I)
plot(Area_I(x).Centroid(1), Area_I(x).Centroid(2), 'b*');
XX(i, x) = Area_I(x).Centroid(1);
YY(i, x) = Area_I(x).Centroid(2);
end
hold off;
end
```
修改后的代码将每张图片的形心坐标保存在 `XX` 和 `YY` 数组中,并且保证了每张图片的处理结果都被正确保存。
阅读全文