利用GPT 将 matlab 内置 bwlookup 函数转C

最近业务需要将 matlab中bwlookup 的转C

这个函数没有现成的m文件参考,内置已经打成库了,所以没有参考源代码

但是它的解释还是很清楚的,可以根据这个来写

Nonlinear filtering using lookup tables - MATLAB bwlookup - MathWorks 中国

A = bwlookup(B,lut) performs a 2-by-2 or 3-by-3 nonlinear neighborhood filtering operation on binary image BW. The neighborhood processing determines an integer index value used to access values in lookup table lut. The fetched lut value becomes the pixel value in output image A at the targeted position.


它说的很清楚,BW是二值图像矩阵,lut是一个512的查找表,对3*3邻居矩阵进行一些滤波(权重和)得到最后结果

用GPT生成一个

#include <stdio.h>
#include <stdlib.h>#define WIDTH 3
#define HEIGHT 3// 将 3x3 邻域编码为一个 9 位二进制数
int encodeNeighborhood(int neighborhood[3][3]) {int code = 0;for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {code = (code << 1) | neighborhood[i][j];}}return code;
}// 应用查找表进行形态学操作
void bwlookup(int input[HEIGHT][WIDTH], int output[HEIGHT][WIDTH], int lut[512]) {int neighborhood[3][3];// 处理内部像素for (int y = 1; y < HEIGHT - 1; ++y) {for (int x = 1; x < WIDTH - 1; ++x) {// 提取 3x3 邻域for (int i = -1; i <= 1; ++i) {for (int j = -1; j <= 1; ++j) {neighborhood[i + 1][j + 1] = input[y + i][x + j];}}// 使用查找表进行转换int code = encodeNeighborhood(neighborhood);output[y][x] = lut[code];}}// 处理边缘像素 (拷贝原始值)for (int x = 0; x < WIDTH; ++x) {output[0][x] = input[0][x];output[HEIGHT-1][x] = input[HEIGHT-1][x];}for (int y = 0; y < HEIGHT; ++y) {output[y][0] = input[y][0];output[y][WIDTH-1] = input[y][WIDTH-1];}
}int main() {// 示例二值图像 (3x3)int input[HEIGHT][WIDTH] = {{1, 0, 1},{0, 1, 0},{1, 0, 1}};// 初始化输出图像int output[HEIGHT][WIDTH] = {0};// 示例查找表int lut[512] = {0};lut[2] = 1; // 设定特定模式的输出值// 应用 bwlookupbwlookup(input, output, lut);// 打印结果图像for (int y = 0; y < HEIGHT; ++y) {for (int x = 0; x < WIDTH; ++x) {printf("%d ", output[y][x]);}printf("\n");}return 0;
}

 显然它给的矩阵滤波器顺序搞错了,它的顺序是

这是行优先,我本来理解为要列优先,其实人matlab代码给出解释了(包括网页)

手动改动下 

仔细观察,

这给地方还有一个加1,c代码中求和一样的code,没有加1,原因是这里做index的时候,c是从0开始,index本身比matlab就要少1

这样计算出来发现还不对,仔细对比,中心数据都对上了,发现还是边缘不对

matlab中的原矩阵需要扩展,扩展的地方都要填0,然后只取中间

把想法交给GPT,让他生成把

#include <stdio.h>#define HEIGHT 5
#define WIDTH 5// 将 3x3 邻域编码为一个 9 位二进制数
int encodeNeighborhood(int arr[3][3]) {int code = 0;for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {code |= (arr[i][j] << (i * 3 + j));}}return code;
}// 应用查找表进行形态学操作
void bwlookup(int input[HEIGHT][WIDTH], int output[HEIGHT][WIDTH], int lut[512]) {int extendedInput[HEIGHT + 2][WIDTH + 2] = {0}; // 扩展后的输入数组,初始化为零int neighborhood[3][3];// 将原始输入复制到扩展后的数组中for (int y = 0; y < HEIGHT; ++y) {for (int x = 0; x < WIDTH; ++x) {extendedInput[y + 1][x + 1] = input[y][x];}}// 对扩展后的数组应用形态学操作for (int y = 1; y < HEIGHT + 1; ++y) {for (int x = 1; x < WIDTH + 1; ++x) {// 提取 3x3 邻域for (int i = -1; i <= 1; ++i) {for (int j = -1; j <= 1; ++j) {neighborhood[i + 1][j + 1] = extendedInput[y + i][x + j];}}// 使用查找表进行转换int code = encodeNeighborhood(neighborhood);output[y - 1][x - 1] = lut[code];}}
}// 测试函数
int main() {int input[HEIGHT][WIDTH] = {{0, 0, 0, 0, 0},{0, 1, 1, 1, 0},{0, 1, 1, 1, 0},{0, 1, 1, 1, 0},{0, 0, 0, 0, 0}};int output[HEIGHT][WIDTH] = {0}; // 初始化输出数组int lut[512]; // 查找表// 初始化查找表 (这里假设查找表已定义)for (int i = 0; i < 512; ++i) {lut[i] = 1; // 这里只是一个示例,你应该根据实际需求初始化查找表}// 应用形态学操作bwlookup(input, output, lut);// 打印输出printf("输出:\n");for (int y = 0; y < HEIGHT; ++y) {for (int x = 0; x < WIDTH; ++x) {printf("%d ", output[y][x]);}printf("\n");}return 0;
}

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

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

相关文章

python请求报错::requests.exceptions.ProxyError: HTTPSConnectionPool

在发送网页请求时&#xff0c;发现很久未响应&#xff0c;最后报错&#xff1a; requests.exceptions.ProxyError: HTTPSConnectionPool(hostsvr-6-9009.share.51env.net, port443): Max retries exceeded with url: /prod-api/getInfo (Caused by ProxyError(Unable to conne…

秒懂设计模式--学习笔记(5)【创建篇-抽象工厂】

目录 4、抽象工厂4.1 介绍4.2 品牌与系列&#xff08;针对工厂泛滥&#xff09;(**分类**)4.3 产品规划&#xff08;**数据模型**&#xff09;4.4 生产线规划&#xff08;**工厂类**&#xff09;4.5 分而治之4.6 抽象工厂模式的各角色定义如下4.7 基于此抽象工厂模式以品牌与系…

vue启动时的错误

解决办法一&#xff1a;在vue.config.js中直接添加一行代码 lintOnSave:false 关闭该项目重新运行就可启动 解决办法二&#xff1a; 修改组件名称

Python容器 之 通用功能

1.切片 1.格式&#xff1a; 数据[起始索引:结束索引:步长 2.适用类型&#xff1a; 字符串(str)、列表(list)、元组(tuple) 3.说明&#xff1a; 通过切片操作, 可以获取数据中指定部分的内容 4.注意 : 结束索引对应的数据不会被截取到 支持正向索引和逆向索引 步长用于设置截取…

配音软件有哪些?分享五款超级好用的配音软件

随着嫦娥六号的壮丽回归&#xff0c;举国上下都沉浸在这份自豪与激动之中。 在这样一个历史性的时刻&#xff0c;我们何不用声音记录下这份情感&#xff0c;让这份记忆以声音的形式流传&#xff1f; 无论是制作视频分享这份喜悦&#xff0c;还是创作音频讲述探月故事&#xff…

Oracle数据库中RETURNING子句

RETURNING子句允许您检索插入、删除或更新所修改的列&#xff08;以及基于列的表达式&#xff09;的值。如果不使用RETURNING&#xff0c;则必须在DML语句完成后运行SELECT语句&#xff0c;才能获得更改列的值。因此&#xff0c;RETURNING有助于避免再次往返数据库&#xff0c;…

Plotly:原理、使用与数据可视化的未来

文章目录 引言Plotly的原理Plotly的基本使用安装Plotly创建基本图表定制图表样式 Plotly的高级特性交互式图表图表动画图表集成 结论 引言 在当今的数据驱动世界中&#xff0c;数据可视化已经成为了一个至关重要的工具。它允许我们直观地理解数据&#xff0c;发现数据中的模式…

CXL-GPU: 全球首款实现百ns以内的低延迟CXL解决方案

数据中心在追求更高性能和更低总拥有成本&#xff08;TCO&#xff09;的过程中面临三大主要内存挑战。首先&#xff0c;当前服务器内存层次结构存在局限性。直接连接的DRAM与固态硬盘&#xff08;SSD&#xff09;存储之间存在三个数量级的延迟差异。当处理器直接连接的内存容量…

VideoPrism——探索视频分析领域模型的算法与应用

概述 论文地址:https://arxiv.org/pdf/2402.13217.pdf 视频是我们观察世界的生动窗口&#xff0c;记录了从日常瞬间到科学探索的各种体验。在这个数字时代&#xff0c;视频基础模型&#xff08;ViFM&#xff09;有可能分析如此海量的信息并提取新的见解。迄今为止&#xff0c;…

【vuejs】vue-router 路由跳转参数传递详解和应用场景及技巧

1. Vue2 Router 路由基础 1.1 路由定义 路由定义是Vue Router中实现页面路由跳转的基础。在Vue2中&#xff0c;路由的定义通常在应用的入口文件或路由配置文件中进行。路由定义涉及到路径模式&#xff08;path&#xff09;、视图组件&#xff08;component&#xff09;以及一…

【数据分析思维--史上最全最牛逼】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;主要和大家分享一下数据分析的思维&#xff01;怎么提好我们对于业务的判断是非常重要的&#xff01;&#xff01;&#xff01;希望对大家有所帮助。 &#x1f49e;&#x1f49e;代码是你…

采煤机作业3D虚拟仿真教学线上展示增强应急培训效果

在化工行业的生产现场&#xff0c;安全永远是首要之务。为了加强从业人员的应急响应能力和危机管理能力&#xff0c;纷纷引入化工行业工艺VR模拟培训&#xff0c;让应急演练更加生动、高效。 化工行业工艺VR模拟培训软件基于真实的厂区环境&#xff0c;精确还原了各类事件场景和…

医疗器械FDA | 医疗器械软件如何做源代码审计?

医疗器械网络安全测试https://link.zhihu.com/?targethttps%3A//www.wanyun.cn/Support%3Fshare%3D24315_ea8a0e47-b38d-4cd6-8ed1-9e7711a8ad5e 医疗器械源代码审计是一个确保医疗器械软件安全性和可靠性的重要过程。以下是医疗器械源代码审计的主要步骤和要点&#xff0c;以…

Vue3 sortablejs 表格拖拽后,表格无法更新的问题处理

实用sortablejs在vue项目中实现表格行拖拽排序 你可能会发现&#xff0c;表格排序是可以实现&#xff0c;但是我们基于数据驱动的vue中关联的数据并没有发生变化&#xff0c; 如果你的表格带有列固定(固定列实际上在dom中有两个表格&#xff0c;其中固定的列在一个表格中&…

【Python】优雅的快速选择 - 快速排序 - 随机快速排序

快速选择&#xff08;递归实现版&#xff09; 这里给出以 “leetcode215. 数组中的第K个最大元素”为例的代码。 class Solution:def findKthLargest(self, nums, k):self.nums numsn len(nums)return self.quickSelect(0,n-1,n-k)def quickSelect(self,l,r,k): # 手撸快速…

Vue3实战笔记(64)—Vue 3自定义指令的艺术:实战中的最佳实践

文章目录 前言一、一些简单的Vue3自定义指令超实用案例总结 前言 书接上文&#xff0c;在Vue3中&#xff0c;自定义指令是一种强大的工具&#xff0c;允许我们扩展HTML元素的功能。通过自定义指令&#xff0c;我们可以创建可重用的行为&#xff0c;并将它们绑定到任何元素上。…

订单折扣金额分摊算法|代金券分摊|收银系统|积分分摊|分摊|精度问题|按比例分配|钱分摊|钱分配

一个金额分摊的算法&#xff0c;将折扣分摊按比例&#xff08;细单实收在总体的占比&#xff09;到各个细单中。 此算法需要达到以下要求&#xff1a; 折扣金额接近细单总额&#xff0c;甚至折扣金额等于细单金额&#xff0c;某些时候甚至超过细单总额&#xff0c;要保证实收不…

游泳哪个牌子好?6大游泳耳机选购技巧总结分享

游泳耳机作为水上运动爱好者和游泳专业人士的必备装备&#xff0c;不仅要能够抵御水的侵入&#xff0c;还要提供清晰的音质和舒适的佩戴体验。在市面上&#xff0c;不同品牌的游泳耳机琳琅满目&#xff0c;选择起来可能会令人头疼。本文旨在为您提供一份详尽的游泳耳机选购指南…

每日一练 - Routing Policy节点逻辑

01 真题题目 一个 routing-policy 下可以有多个节点,不同节点号用 node 标识,每个节点下可以有多个if-match 和 apply 子句,下面哪些描述是错误的? A. 不同节点之间是“或"的关系 B. 当路由与该节点的任意一个 if-match 条件匹配失败后&#xff0c;系统自动转入下一节点…

Gemma轻量级开放模型在个人PC上释放强大性能,让每个桌面秒变AI工作站

Google DeepMind团队最近推出了Gemma&#xff0c;这是一个基于其先前Gemini模型研究和技术的开放模型家族。这些模型专为语言理解、推理和安全性而设计&#xff0c;具有轻量级和高性能的特点。 Gemma 7B模型在不同能力领域的语言理解和生成性能&#xff0c;与同样规模的开放模型…