C#opencv 遍历图像中所有点 不在圆范围内的点变为黑色,在圆范围内的保持原色

news2025/3/16 19:47:55

C#opencv 遍历图像中所有点 不在圆范围内的点变为黑色,在圆范围内的保持原色

安装 Install-Package OpenCvSharp4
Install-Package OpenCvSharp4.Windows

普通实现

using System;
using System.Collections.Generic;
using System.Linq;
using OpenCvSharp; // 添加OpenCV引用

class Program
{
    static void Main(string[] args)
    {
        // 原有代码...
        
        // 添加圆形遮罩处理图像的示例
        ProcessImageWithCircleMask("input.jpg", "output.jpg", 300, 300, 200);
    }
    
    // 处理图像,将不在圆范围内的点变为黑色
    static void ProcessImageWithCircleMask(string inputPath, string outputPath, int centerX, int centerY, int radius)
    {
        try
        {
            // 读取图像
            using (Mat src = Cv2.ImRead(inputPath))
            {
                if (src.Empty())
                {
                    Console.WriteLine("无法读取图像!");
                    return;
                }
                
                // 创建一个与原图像大小相同的黑色图像
                using (Mat result = Mat.Zeros(src.Size(), src.Type()))
                {
                    // 遍历图像中的每个像素
                    for (int y = 0; y < src.Height; y++)
                    {
                        for (int x = 0; x < src.Width; x++)
                        {
                            // 计算点到圆心的距离
                            double distance = Math.Sqrt(Math.Pow(x - centerX, 2) + Math.Pow(y - centerY, 2));
                            
                            // 如果点在圆内,保持原色;否则为黑色
                            if (distance <= radius)
                            {
                                // 获取原图像的像素值并设置到结果图像中
                                Vec3b color = src.Get<Vec3b>(y, x);
                                result.Set(y, x, color);
                            }
                        }
                    }
                    
                    // 保存结果图像
                    Cv2.ImWrite(outputPath, result);
                    Console.WriteLine($"处理完成,结果已保存到 {outputPath}");
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"处理图像时出错: {ex.Message}");
        }
    }

    // 生成随机坐标点
    static List<Point> GenerateRandomPoints(int count, int minX, int maxX, int minY, int maxY)
    {
        // 原有代码...
    }
    
    // 其他原有方法...
}

// 原有类定义...

如果你想要更高效的实现,可以使用OpenCV的内置函数:

using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace resistanceWelding
{
    class testOpencv
    {
        public static void ProcessImageWithCircleMaskEfficient(string inputPath, string outputPath, int centerX, int centerY, int radius)
        {
            try
            {
                // 读取图像
                using (Mat src = Cv2.ImRead(inputPath))
                {
                    if (src.Empty())
                    {
                        Console.WriteLine("无法读取图像!");
                        return;
                    }

                    // 创建一个与原图像大小相同的黑色掩码
                    using (Mat mask = Mat.Zeros(src.Size(), MatType.CV_8UC1))
                    {
                        // 在掩码上绘制白色圆形
                        Cv2.Circle(mask, new Point(centerX, centerY), radius, Scalar.White, -1);

                        // 创建结果图像
                        using (Mat result = new Mat(src.Size(), src.Type(), Scalar.Black))
                        {
                            // 使用掩码将原图像复制到结果图像
                            src.CopyTo(result, mask);

                            // 保存结果图像
                            Cv2.ImWrite(outputPath, result);
                            Console.WriteLine($"处理完成,结果已保存到 {outputPath}");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"处理图像时出错: {ex.Message}");
            }
        }



    }
}

类型转换

需要安装   OpenCvSharp4.Extensions

using Cognex.VisionPro;
using Cognex.VisionPro.ImageFile;
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace resistanceWelding
{
    class testOpencv
    {
        public static void ProcessImageWithCircleMaskEfficient(string inputPath, string outputPath, int centerX, int centerY, int radius)
        {
            try
            {
                int dd = 2;
                Mat src;
                if(dd == 22)
                {
                    // 读取图像
                    src = Cv2.ImRead(inputPath);
                }
                //else if(dd == 1)
                //{
                //    CogImageFile cogImage = new CogImageFile();
                //    cogImage.Open(inputPath, CogImageFileModeConstants.Read);
                  

                //}
                else
                {
                    var originalBitmap = new System.Drawing.Bitmap(inputPath);
                    src = OpenCvSharp.Extensions.BitmapConverter.ToMat(originalBitmap);

                 
                }
   
                if (src.Empty())
                {
                    Console.WriteLine("无法读取图像!");
                    return;
                }

                // 创建一个与原图像大小相同的黑色掩码
                Mat mask = Mat.Zeros(src.Size(), MatType.CV_8UC1);

                // 在掩码上绘制白色圆形
                Cv2.Circle(mask, new Point(centerX, centerY), radius, Scalar.White, -1);

                // 创建结果图像
                Mat result = new Mat(src.Size(), src.Type(), Scalar.Black);

                // 使用掩码将原图像复制到结果图像
                src.CopyTo(result, mask);

                // 保存结果图像
                Cv2.ImWrite(outputPath, result);
                Console.WriteLine($"处理完成,结果已保存到 {outputPath}");



            }
            catch (Exception ex)
            {
                Console.WriteLine($"处理图像时出错: {ex.Message}");
            }
        }



    }
}

C# 图像之间转换代码_c# bitmap.palette-CSDN博客

//转为 bitmap方法一:
Bitmap map = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat);
process_pictureBox.Image = map;

//转为 bitmap方法二:

Bitmap map = new Bitmap(mat.ToMemoryStream());
process_pictureBox.Image = map;


//Image img 转为Mat
Bitmap bitmap = new Bitmap(img);//Image img
OpenCvSharp.Mat mat = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);//用
 
//bitmap转换为mat
C#中Bitmap 与 Image 之间的转换
Image img = pictureBox1.Image;
Bitmap map = new Bitmap(img);
 
//而Bitmap直接可以赋值 给 Image 对象
 
Image img = Bitmap;

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

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

相关文章

基于SSM + JSP 的图书商城系统

基于SSM的图书商城 网上书城、图书销售系统、图书销售平台 &#xff5c;Java&#xff5c;SSM&#xff5c;HTML&#xff5c;JSP&#xff5c; 项目采用技术&#xff1a; ①&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Tomcat ②&#xff1a;技术栈&#xff1a;Java、…

【漫话机器学习系列】133.决定系数(R²:Coefficient of Determination)

决定系数&#xff08;&#xff09;详解 决定系数&#xff08;&#xff09;是回归分析中用于评估模型拟合优度的一个重要统计指标。它表示自变量&#xff08;特征变量&#xff09;能够解释因变量&#xff08;目标变量&#xff09;变异的程度&#xff0c;取值范围为 [0,1] 或 (−…

Machine Learning: 十大基本机器学习算法

机器学习算法分类&#xff1a;监督学习、无监督学习、强化学习 基本的机器学习算法&#xff1a; 线性回归、支持向量机(SVM)、最近邻居(KNN)、逻辑回归、决策树、k平均、随机森林、朴素贝叶斯、降维、梯度增强。 机器学习算法大致可以分为三类&#xff1a; 监督学习算法 (Sup…

【八股文】ArrayList和LinkedList的区别

先讲讲两者是如何实现的 ArrayList public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable {transient Object[] elementData; private int size; } 通过源码可以看出&#xff0c;ArrayLis…

汇编语言 | 王爽 | 学习笔记

汇编语言 | 王爽 | 学习笔记 文章目录 汇编语言 | 王爽 | 学习笔记一、基础知识1、指令2、存储器3、总线1、总线2、CPU对存储器的读写3、CPU对外设的控制 4、内存地址空间 二、寄存器1、寄存器2、通用寄存器3、8086CPU给出物理地址的方法4、段寄存器1、CS和IP2、DS 和 [address…

JumpServer基础功能介绍演示

堡垒机可以让运维人员通过统一的平台对设备进行维护&#xff0c;集中的进行权限的管理&#xff0c;同时也会对每个操作进行记录&#xff0c;方便后期的溯源和审查&#xff0c;JumpServer是由飞致云推出的开源堡垒机&#xff0c;通过简单的安装配置即可投入使用&#xff0c;本文…

EDID读取学习

简介 Video BIOS可以被认为是一个具有独立硬件抽象层的操作系统。它不会阻止或监视操作系统、应用程序或设备驱动程序对硬件的直接访问。虽然不推荐,但一些DOS应用程序确实可以改变基本的硬件设置,而根本不需要通过视频BIOS。大多数现代应用程序和操作系统都避免直接使用硬件…

【笔记】深度学习模型训练的 GPU 内存优化之旅:综述篇

开设此专题&#xff0c;目的一是梳理文献&#xff0c;目的二是分享知识。因为笔者读研期间的研究方向是单卡上的显存优化&#xff0c;所以最初思考的专题名称是“显存突围&#xff1a;深度学习模型训练的 GPU 内存优化之旅”&#xff0c;英文缩写是 “MLSys_GPU_Memory_Opt”。…

2024山东大学计算机复试上机真题

2024山东大学计算机复试上机真题 2024山东大学计算机复试机试真题 历年山东大学计算机复试上机真题 历年山东大学计算机复试机试真题 在线评测&#xff1a;传动门&#xff1a;pgcode.cn 最长递减子序列 题目描述 输入数字 n&#xff0c;和 n 个整数&#xff0c;输出该数字…

Vue 计算属性与 Data 属性同名问题深度解析

文章目录 1. 问题背景与核心概念1.1 Vue 响应式系统架构1.2 核心概念定义 2. 同名问题的技术分析2.1 同名场景示例2.2 问题发生机制 3. 底层原理剖析3.1 Vue 初始化流程3.2 响应式系统关键代码 4. 问题解决方案4.1 最佳实践建议4.2 错误处理机制 5. 性能影响分析5.1 递归调用性…

[文献阅读] 可变形卷积DCN - Deformable Convolutional Networks

**文献信息&#xff1a;**Deformable Convolutional Networks arxiv.org/abs/1703.06211 发表于ICCV 2017&#xff0c;提出了可变形卷积DCN&#xff08;Deformable ConvNets&#xff09; 摘要 卷积神经网络&#xff08;CNN&#xff09;由于其构建模块固定的几何结构天然地局限…

【统计学相关笔记】2. 多元正态的Cochran定理

fisher 引理 如何说明一个线性变换和二次型独立&#xff1a; 二次型矩阵和线性变换阵乘积0即可。

蓝桥杯刷题——第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

一、0握手问题 - 蓝桥云课 算法代码&#xff1a; #include <iostream> using namespace std; int main() {int sum0;for(int i49;i>7;i--)sumi;cout<<sum<<endl;return 0; } 直接暴力&#xff0c;题意很清晰&#xff0c;累加即可。 二、0小球反弹 - 蓝…

Canoe Panel常用控件

文章目录 一、Panel 中控件分类1. 指示类控件2. 功能类控件3. 信号值交互类控件4. 其他类控件 二、控件使用方法1. Group Box 控件2. Input/Output Box控件3. Static Text控件4. Button控件5. Switch/Indicator 控件 提示&#xff1a;Button 和 Switch 的区别参考 一、Panel 中…

【软考-架构】11.3、设计模式-新

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 项目中的应用设计模式创建型设计模式结构型设计模式行为型设计模式 &#x1f4af;考试真题题外话 项目中的应用 在实际项目中&#xff0c;我应用过多种设计模式来解决不同…

【大模型(LLMs)RAG 检索增强生成 面经】

1 RAG 基础面 1.1 为什么大模型需要外挂 (向量) 知识库? 如何将外部知识注入大模型,最直接的方法:利用外部知识对大模型进行微调。 思路: 构建几十万量级的数据,然后利用这些数据 对大模型进行微调,以将 额外知识注入大模型 优点: 简单粗暴 缺点: 这几十万量级的数据…

Centos 7 安装达梦数据库

一、环境准备 1. 确认操作系统的版本和数据库的版本是否一致 cat /etc/redhat-release 2. 关闭防火墙 查看防火墙状态 firewall-cmd --state 停止firewall systemctl stop firewalld.service 禁止firewall开机启动 systemctl disable firewalld.service 3. 修改文件l…

@Autowired 注解在构造器上的使用规则(字段注入也挺好的)

背景 在看Spring Framework官方文档时&#xff0c;看到这样一段描述&#xff1a; As of Spring Framework 4.3, an Autowired​ annotation on such a constructor is no longer necessary if the target bean defines only one constructor to begin with. However, if seve…

深度学习视觉2D检测算法综述

目录 一、两阶段目标检测算法 1.1 R-CNN&#xff08;Region-based CNN&#xff0c;2014&#xff09; 1.2 Fast R-CNN&#xff08;Fast Region-based CNN&#xff0c;2015&#xff09; 1.3 Faster R-CNN&#xff08;Faster Region-based CNN&#xff0c;2016&#xff09; 1…

复试不难,西电马克思主义学院—考研录取情况

01、马克思主义学院各个方向 02、24马克思主义学院近三年复试分数线对比 PS&#xff1a;马院24年院线相对于23年院线增加15分&#xff0c;反映了大家对于马克思主义理论学习与研究的热情高涨&#xff0c;也彰显了学院在人才培养、学科建设及学术研究等方面的不断进步与成就。 6…