【图像分割】光流生成标签(matlab)

文章目录

  • 1. 框架
  • 2. opticalFlow_label
  • 3. 光流

1. 框架

在这里插入图片描述

2. opticalFlow_label

close all; clear; clc;
% 使用光流进行标签的生成
%% 视频帧的读取
npy_data = readNPY('train.npy');%% 提取标签的坐标
first_label = squeeze(npy_data(2,1,:,:));
h = fspecial("gaussian", [3, 3], 1);
first_label_g = imfilter(first_label, h, 'replicate');   % 'conv'
first_label_c = edge(first_label_g, "canny");
% imshow(uint8(first_label_c*255));
first_label_double = im2double(first_label_c);
first_label_bw = im2bw(first_label_double, 0.5);
% imshow(uint8(first_label_bw * 255));
[h, w] = size(first_label);
xPos = [];
yPos = [];
step = 0;
for i = 1:hfor j = 1:wif first_label_bw(i, j) == 1
%             xPos = [xPos, i];       % 保存为行
%             yPos = [yPos, j];step = step + 1;if mod(step, 1) == 0xPos = [xPos; j];   % 保存为列yPos = [yPos; i];endendend
end%% 逐帧处理
first_frame = squeeze(npy_data(1,1,:,:));
first_frame = uint8(first_frame);
% imshow(first_frame);
[c,frame_num,img_h,img_w] = size(npy_data);
num = 0;
save_npy(1,1,:,:) = first_frame;
save_npy(2,1,:,:) = first_frame;   % 预留一个通道,用于保存标签for i = 2  % 2:frame_numnum = num + 1;currFrame = squeeze(npy_data(1,i,:,:));currFrame = uint8(currFrame);pyramidLayer = 4;kernelSize = 3;sigma = 1.5;iterNumMax = 5;ww = 13;[u, v] = affineLKopticalFlow(first_frame, currFrame, xPos, yPos, pyramidLayer, kernelSize, sigma, iterNumMax, ww);% 显示newFrame = repmat(currFrame, [1, 1, 3]);new_xPos = xPos + u;new_yPos = yPos + v;newFrame1 = zeros(size(currFrame));for kk = 1:length(xPos)%显示newFrame(int16(new_yPos(kk)), int16(new_xPos(kk)), 1) = 255;newFrame(:, :, 2) = currFrame;newFrame(int16(new_yPos(kk)), int16(new_xPos(kk)), 3) = 0;newFrame1(int16(new_yPos(kk)), int16(new_xPos(kk))) = 1;end   save_npy(1,i,:,:) = currFrame;save_npy(2,i,:,:) = first_frame;
%     writeNPY(save_npy, "test.npy");figure(1)imshow(newFrame)title("Pre")% 形态学处理 离散点的连接se = strel('disk',51);   % 加大半径 可以进行填充fc = imclose(newFrame1, se);
%     imwrite(fc, "fc.jpg")% bw = im2bw(fc);% fill_img = imfill(bw, "holes");   % 封闭区域figure(2)imshow(fc)title("fc")%将mask显示在图片上mask_frame = repmat(currFrame, [1, 1, 3]);[mask_h, mask_w, channel] = size(mask_frame);for i = 1:mask_hfor j = 1:mask_wif fc(i, j) == 1mask_frame(i, j, 1) = 255;mask_frame(:, :, 2) = currFrame;mask_frame(i, j, 3) = 0;end endendfigure(4)imshow(mask_frame)title("mask")first_frame = currFrame;xPos = double(int16(new_xPos));yPos = double(int16(new_yPos));end

3. 光流

% author        : huangcan
% date           : 2019.4.22
% comment   : this code is an implementation of Local antomical affine optical flow algorithm
% reference   : paper: "Fast Left Ventricle Tracking in 3D Echocardiographic Data Using Anatomical Affine Optical Flow"
% parameter  : 
%                       lastFrame           上一帧的图像
%                       currFrame   当前帧的图像
%                       xPos      要跟踪的点的横坐标
%                       yPos                    要跟踪的点的纵坐标
%                       pyramidLayer    尺度金字塔的层数(包含原始层)
%                       kernelSize         高斯模糊的模板尺寸大小,3即可
%                       sigma               高斯模糊标准差
%                       iterNumMax  迭代次数上限,一般4次即可
%                       ww                      ROI框的尺寸,注意确保多尺度后的尺寸仍在图像范围内function [u, v] = affineLKopticalFlow(lastFrame, currFrame, xPos, yPos, pyramidLayer, kernelSize, sigma, iterNumMax, ww)u = zeros(length(xPos),1);
v = zeros(length(xPos),1);%% build image pyramid
fr1Pyramid = cell(pyramidLayer,1);
fr2Pyramid = cell(pyramidLayer,1);
fr1Pyramid{1} = lastFrame;
fr2Pyramid{1} = currFrame;h = fspecial('gaussian',[kernelSize kernelSize], sigma);
for i = 2:pyramidLayer%h = fspecial('gaussian', [3 3], 0.83^(i-2)); temp1 = imfilter(fr1Pyramid{i-1}, h, 'same');temp2 = imfilter(fr2Pyramid{i-1}, h, 'same');fr1Pyramid{i} = imresize(temp1, 1/2);fr2Pyramid{i} = imresize(temp2, 1/2);
end%% coarse to fineg = zeros(length(xPos), 6, pyramidLayer + 1);for i = pyramidLayer:-1:1im1 = im2double(fr1Pyramid{i});im2 = im2double(fr2Pyramid{i});% for each point, calculate I_x, I_yIx_m = filter2([-1 0 1; -1 0 1; -1 0 1],im1, 'same'); % partial on xIy_m = filter2([-1 -1 -1; 0 0 0; 1 1 1],im1,  'same'); % partial on yxPosPyramid = xPos ./ 2^(i-1);yPosPyramid = yPos ./ 2^(i-1);for xx = 1:length(xPos)%x0 = [u; v; ux; uy; vx; vy];这个不是运动矩阵,而是参数矩阵%matG = [1+g(xx, 3, i+1) g(xx, 4, i+1) g(xx, 1, i+1); g(xx, 5, i+1) 1+g(xx, 6, i+1) g(xx, 2, i+1); 0 0 1];%粗精度下的运动矩阵matGmatG = [1 0 g(xx, 1, i+1); 0 1 g(xx, 2, i+1); 0 0 1];matX0 = [1 0 0;0 1 0;0 0 1] * matG;x0 = [matX0(1,3);matX0(2,3);matX0(1,1) - 1;matX0(1,2);matX0(2,1);matX0(2,2) - 1];for k = 1:iterNumMax% x0为组合仿射矩阵,迭代计算,相对于fr1x = calcAAOF(Ix_m, Iy_m, im1, im2, xPosPyramid, yPosPyramid, ww, xx, x0);% affine motion combinationmatX1 = [1+x(3) x(4) x(1); x(5) 1+x(6) x(2); 0 0 1];matX0 = matX1 * matX0;x0 = [matX0(1,3); matX0(2,3); matX0(1,1) - 1; matX0(1,2); matX0(2,1); matX0(2,2) - 1];end%此时X0为该层金字塔相对于第一帧的仿射参数,matX0为相对于第一帧的仿射矩阵if (i >= 2)% 为更细精度的分析进行运动放大iterFinal = [2 0 0;0 2 0;0 0 1] * matX0;g(xx,:,i) = [iterFinal(1,3); iterFinal(2,3); iterFinal(1,1)-1; iterFinal(1,2); iterFinal(2,1); iterFinal(2,2)-1];else% 最终层不需要变化iterFinal = matX0;g(xx,:,i) = [iterFinal(1,3); iterFinal(2,3); iterFinal(1,1) - 1; iterFinal(1,2); iterFinal(2,1); iterFinal(2,2) - 1];endendendfor xx = 1:length(xPos)u(xx) = g(xx, 1, 1);v(xx) = g(xx, 2, 1);
endend% sum
function x = calcAAOF(Ix_m, Iy_m, im1, im2, xPos, yPos, ww, ix, x0)%x0 = [u v ux1 ux2 vx1 vx2];w = floor(ww/2);if (length(xPos) > 100)weightMatPhase = ones(ww,ww);
elseweightMatPhase = zeros(ww, ww);for i = 1 : wwfor j = 1 : wwxc = int16(xPos(ix)) - (ww + 1) / 2 + i;yc = int16(yPos(ix)) - (ww + 1) / 2 + j;weightMatPhase(j,i) = 0;for ii = 1:length(xPos)dis = sqrt((double(xc) - double(xPos(ii)))^2 + (double(yc) - double(yPos(ii)))^2);if (dis < sqrt(2)*ww)weightMatPhase(j, i) = weightMatPhase(j, i) +1;endendendend
end
weight = weightMatPhase(:);xx = ix;
i = int16(xPos(xx));
j = int16(yPos(xx));%Ix = Ix_m(j-w:j+w, i-w:i+w);
Ix = iGetN(Ix_m,i,j,2*w+1);
%Iy = Iy_m(j-w:j+w, i-w:i+w);
Iy = iGetN(Iy_m, i, j, 2*w+1);% affine model
newX = zeros(size(Ix));
newY = zeros(size(Iy));
for iSecond = -w:w %xfor jSecond = -w:w %yiiMoveSecond = x0(1) + x0(3)*double(iSecond) + x0(4)*double(iSecond);jjMoveSecond = x0(2) + x0(5)*double(jSecond) + x0(6)*double(jSecond);newX(jSecond+w+1,iSecond+w+1) = double(i) + iSecond + iiMoveSecond;newY(jSecond+w+1,iSecond+w+1) = double(j) + jSecond + jjMoveSecond;end
end
% bilinear interp2
newXX = linspace(1, size(im2,2), size(im2,2));
newYY = linspace(1, size(im2,1), size(im2,1));Xfirst = repmat(newXX, [size(im2,1) 1]);
Yfirst = repmat(newYY', [1 size(im2,2)]);
newIm2 = interp2(Xfirst, Yfirst, im2, newX,newY);
% calculate time difference
%It = newIm2 - im1(j-w:j+w, i-w:i+w);
It = newIm2 - iGetN(im1, i, j, 2*w+1);Ix = Ix(:);
Iy = Iy(:);
It = It(:);tempX = linspace(-w, w, 2*w+1);
tempY = linspace(-w, w, 2*w + 1);xCoord = repmat(tempX, [2*w + 1 1]);
yCoord = repmat(tempY', [1 2*w+ 1]);
xCoord = xCoord(:);
yCoord = yCoord(:);A11 = sum(sum(weight .* Ix .* Ix));% w Ix Ix
A12 = sum(sum(weight .* Ix .* Iy));% w Ix Iy
A13 = sum(sum(xCoord .* weight .* Ix .* Ix));% x w Ix Ix
A14 = sum(sum(yCoord .* weight .* Ix .* Ix));% y w Ix Ix
A15 = sum(sum(xCoord .* weight .* Ix .* Iy));% x w Ix Iy
A16 = sum(sum(yCoord .* weight .* Ix .* Iy));% y w Ix Iy
A21 = sum(sum(weight .* Ix .* Iy));% w Ix Iy
A22 = sum(sum(weight .* Iy .* Iy));% w Iy Iy
A23 = sum(sum(xCoord .* weight .* Ix .* Iy));%x w Ix Iy
A24 = sum(sum(yCoord .* weight .* Ix .* Iy));%y w Ix Iy
A25 = sum(sum(xCoord .* weight .* Iy .* Iy));%x w Iy Iy
A26 = sum(sum(yCoord .* weight .* Iy .* Iy));%y w Iy Iy
A31 = sum(sum(xCoord .* weight .* Ix .* Ix));%x w Ix Ix
A32 = sum(sum(xCoord .* weight .* Ix .* Iy));% x w Ix Iy
A33 = sum(sum(xCoord.^2 .* weight .* Ix .* Ix));%x^2 w Ix Ix
A34 = sum(sum(xCoord .* yCoord .* weight .* Ix .* Ix));% x y Ix Ix
A35 = sum(sum(xCoord .^ 2 .* weight .* Ix .* Iy));% x^2 w Ix Iy
A36 = sum(sum(xCoord .* yCoord .* weight .* Ix .* Iy));% x y w Ix Iy
A41 = sum(sum(yCoord .* weight .* Ix .* Ix));% y w Ix Ix
A42 = sum(sum(yCoord .* weight .* Ix .* Iy));% y w Ix Iy
A43 = sum(sum(xCoord .* yCoord .* weight .* Ix .* Ix));% x y w Ix Ix
A44 = sum(sum(yCoord .^ 2 .* weight .* Ix .* Ix));%y^2 w Ix Ix
A45 = sum(sum(xCoord .* yCoord .* weight .* Ix .* Iy));% x y w Ix Iy
A46 = sum(sum(yCoord .^ 2 .* weight .* Ix .* Iy));% y^2 w Ix Iy
A51 = sum(sum(xCoord .* weight .* Ix .* Iy));% x^2 w Ix Iy
A52 = sum(sum(xCoord .* weight .* Iy .* Iy));% x w Iy Iy
A53 = sum(sum(xCoord .^ 2 .* weight .* Ix .* Iy));% x^2 w Ix Iy
A54 = sum(sum(xCoord .* yCoord .* weight .* Ix .* Iy));% x y w Ix Iy
A55 = sum(sum(xCoord .^ 2 .* weight .* Iy .* Iy));% x^2 w Iy Iy
A56 = sum(sum(xCoord .* yCoord .* weight .* Iy .* Iy));% x y w Iy Iy
A61 = sum(sum(yCoord .* weight .* Ix .* Iy));% y w Ix Iy
A62 = sum(sum(yCoord .* weight .* Iy .* Iy));%y w Iy Iy
A63 = sum(sum(xCoord .* yCoord .* weight .* Ix .* Iy));% x y w Ix Iy
A64 = sum(sum(yCoord .^ 2 .* weight .* Ix .* Iy));% y^2 w Ix Iy
A65 = sum(sum(xCoord .* yCoord .* weight .* Iy .* Iy));% x y w Iy Iy
A66 = sum(sum(yCoord .^ 2 .* weight .* Iy .* Iy));% y^2 w Iy IyA = [A11 A12 A13 A14 A15 A16; A21 A22 A23 A24 A25 A26; A31 A32 A33 A34 A35 A36; A41 A42 A43 A44 A45 A46; A51 A52 A53 A54 A55 A56; A61 A62 A63 A64 A65 A66];b11 = -sum(sum(weight .* Ix .* It));%w Ix It
b12 = -sum(sum(weight .* Iy .* It));%w Iy It
b13 = -sum(sum(xCoord .* weight .* Ix .* It));%x w Ix It
b14 = -sum(sum(yCoord .* weight .* Ix .* It));% y w Ix It
b15 = -sum(sum(xCoord .* weight .* Iy .* It));% x w Iy It
b16 = -sum(sum(yCoord .* weight .* Iy .* It));% y w Iy Itb = [b11;b12;b13;b14;b15;b16];%x = A \ b;
x = pinv(A) * b;
nanIdx = find(isnan(x) == 1);
x(nanIdx) = zeros(size(nanIdx));
endfunction r=iGetN(m,x,y,N)[h,w,c]=size(m);
halfN = floor(N/2);
n1=halfN; n2=N-halfN-1;
r=zeros(N,N,c);
xmin=max(1,x-n1);
xmax=min(w,x+n2);
ymin=max(1,y-n1);
ymax=min(h,y+n2);
pxmin=halfN-(x-xmin)+1; pxmax=halfN+(xmax-x)+1;
pymin=halfN-(y-ymin)+1; pymax=halfN+(ymax-y)+1;
r(pymin:pymax,pxmin:pxmax,:)=m(ymin:ymax,xmin:xmax,:);
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PgSQL之WITH Queries/Statement

PostgreSQL WITH 子句 在 PostgreSQL 中&#xff0c;WITH 子句提供了一种编写辅助语句的方法&#xff0c;以便在更大的查询中使用。 WITH 子句有助于将复杂的大型查询分解为更简单的表单&#xff0c;便于阅读。这些语句通常称为通用表表达式&#xff08;Common Table Express…

快速了解开发过程中VO、DTO、BO、 DO、PO、POJO、Entity的概念、区别、作用

​ 目录 ​前言 VO&#xff08;Value Object&#xff0c;值对象&#xff09; DTO&#xff08;Data Transfer Object&#xff0c;数据传输对象&#xff09; BO&#xff08;Business Object&#xff0c;业务对象&#xff09; DO&#xff08;Data Object&#xff0c;数据对象…

OpenCV从入门到精通实战(六)——多目标追踪

基于原生的追踪 使用OpenCV库实现基于视频的对象追踪。通过以下步骤和Python代码&#xff0c;您将能够选择不同的追踪器&#xff0c;并对视频中的对象进行实时追踪。 步骤 1: 导入必要的库 首先&#xff0c;我们需要导入一些必要的Python库&#xff0c;包括argparse、time、…

三级等保安全解决方案——实施方案

实施方案设计 本方案将依照国家有关信息安全建设的一系列法规和政策&#xff0c;为电台建立体系完整、安全功能强健、系统性能优良的网络安全系统。以“统一规划、重点明确、合理建设、逐步强化”为基本指导原则。根据电台网络系统不同信息的重要性调整保护策略&#xff0c;不欠…

SpringBoot项目创建,详细流程

一、前言 Spring Boot是一个开源的Java框架&#xff0c;由Pivotal团队&#xff08;现为VMware旗下&#xff09;开发&#xff0c;通过提供默认配置和一系列启动器&#xff08;starters&#xff09;来简化项目配置&#xff0c;使得开发者能够快速启动和运行Spring应用程序。 ‍ …

K8s 部署 elasticsearch-7.14.0 集群 及 kibana 客户端

一、K8s 部署 elasticsearch-7.14.0 集群 安装规划 组件replicas类型es3StatefulSetkibana1Deployment 使用 k8s 版本为&#xff1a;v1.18.0 。 本次使用 OpenEBS 来作为存储引擎&#xff0c;OpenEBS 是一个开源的、可扩展的存储平台&#xff0c;它提供了一种简单的方式来创…

国内首款千亿参数MoE模型APUS-xDAN-4.0:性能逼近GPT-4,可在4090显卡上运行

前言 随着人工智能技术的快速发展&#xff0c;模型参数的数量已成为衡量其复杂性和处理能力的重要指标。近日&#xff0c;国内科技企业APUS与AI创企新旦智能联合宣布&#xff0c;成功开源了国内首个千亿参数的混合专家模型&#xff08;MoE&#xff09;&#xff0c;APUS-xDAN-4…

锁策略和死锁问题

锁策略 乐观锁 vs 悲观锁重量级锁 vs 轻量级锁自旋锁 vs 挂起等待锁读写锁 vs 互斥锁公平锁 vs 非公平锁可重入锁 vs 不可重入锁死锁死锁产生的必要条件如何简单的解决死锁问题 小结 这里不是描述的某个特定锁,而是描述的锁的特性,描述的是"一类锁". 乐观锁 vs 悲观…

Java配置环境变量的过程

第一步&#xff1a;先找到你下载java的文件夹。 第二步&#xff1a;点击它进入看到新的文件夹继续点击。 第三步&#xff1a;点击bin文件。 第四步&#xff1a;点进去bin文件之后复制上述文件的地址。 第五步&#xff1a;回到你的电脑位置右键鼠标点击空白位置出现属性点进去 第…

设计模式胡咧咧之策略工厂实现导入导出

策略模式&#xff08;Strategy Pattern&#xff09; 定义&#xff1a; 定义了一组算法&#xff0c;将每个算法都封装起来&#xff0c;并且使它们之间可以互换。 本质: 分离算法&#xff0c;选择实现 应用场景 何时使用 一个系统有许多类&#xff0c;而区分他们的只是他们直接…

复合机器人在磁钢上下料中的应用及其优势分析

复合机器人是一种集成了移动机器人和工业机器人功能的设备&#xff0c;其独特之处在于拥有“手、脚、眼、脑”的综合能力&#xff0c;从而实现了更高的灵活性和操作效率。在磁钢上下料的应用场景中&#xff0c;复合机器人能够发挥显著的优势。 首先&#xff0c;复合机器人可以根…

Photomator 3.3.5 (macOS Universal) - 照片编辑软件

Photomator 3.3.5 (macOS Universal) - 照片编辑软件 适用于 Mac、iPhone 和 iPad 的终极照片编辑器 请访问原文链接&#xff1a;https://sysin.org/blog/photomator/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Photomat…

计算机网络 -- 网络编程基础

一 学习准备 1.1 IP地址 在 前文中我们提到过: IP 是全球网络的基础&#xff0c;使用 IP 地址来标识公网环境下主机的唯一性&#xff0c;我们可以根据 目的IP地址 进行跨路由器的远端通信。 但是我们也提到了&#xff0c;通过 IP 地址&#xff0c;只能寻找到目标主机&#xff…

视频质量度量VQM算法详细介绍

视频质量评价 视频质量评价(Video Quality Assessment,VQA)是指通过主观、客观的方式对视频图像的内容、画质等,进行感知、衡量与评价。 ITU definations subjective assessment: the determination of the quality or impairment of programme-like pictures presented…

【代码随想录】【动态规划】day48:打家劫舍

打家劫舍1 def rob(self, nums):""":type nums: List[int]:rtype: int"""# 分为两个情况&#xff0c;偷还是不偷&#xff0c;# dp[i]为考虑到第i个房间时的最大值if len(nums) 0: # 如果没有房屋&#xff0c;返回0return 0if len(nums) 1: #…

【 书生·浦语大模型实战营】作业(五):LMDeploy 量化部署

【 书生浦语大模型实战营】作业&#xff08;五&#xff09;&#xff1a;LMDeploy 量化部署 &#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系…

Linux debian gdb dump

1.开发背景 记录 debian 下应用程序崩溃调试方法 2.开发需求 程序越界可以定位到越界的位置附近 3.开发环境 debian 操作系统&#xff0c;如果不支持需要查看是否存在对应的可执行文件 4.实现步骤 4.1 设置 dump 输出大小 ulimit -c unlimited # 设置输出大小 生成core 文…

【QT+OpenCV】车牌号检测 学习记录 遇到的问题

【QTOpenCV】车牌号检测 学习记录 首先在QT里面配置好OpenCV .pro文件中加入&#xff1a; INCLUDEPATH G:/opencv/build/include LIBS -L"G:/opencv/build/x64/vc14/lib"\-lopencv_core \-lopencv_imgproc \-lopencv_highgui \-lopencv_ml \-lopencv_video \-lo.c…

Linux下SPI设备驱动实验:使用内核提供的读写SPI设备中的数据的函数

一. 简介 前面文章的学习&#xff0c;已经实现了 读写SPI设备中数据的功能。文章如下&#xff1a; Linux下SPI设备驱动实验&#xff1a;验证读写SPI设备中数据的函数功能-CSDN博客 本文来使用内核提供的读写SPI设备中的数据的API函数&#xff0c;来实现读写SPI设备中数据。 …

HTML5+JavaScript实现本地视频/音频播放器

HTML5JavaScript实现本地视频/音频播放器 HTML5 提供了本地视频和音频播放器的支持&#xff0c;通过 <video> 和 <audio> 标签&#xff0c;这些标签支持多种媒体格式&#xff0c;并且可以通过 JavaScript 进行控制&#xff0c;实现功能比较完整的本地视频音频播放器…