gpt4 book ai didi

c++ - OpenCV/C++ - 编辑所有孤立的像素

转载 作者:太空狗 更新时间:2023-10-29 21:15:34 26 4
gpt4 key购买 nike

我有一个灰度图像,其中只包含黑色和白色。由于噪声,有一些孤立的黑色像素,我想将其去除。我知道打开和关闭可能是一个解决方案,但我觉得它们不是我形象的最佳选择。所以我写了这个:

for (int i = 1; i < pixels.rows; ++i) {
for (int j = 1; j < pixels.cols; ++j) {
if ((pixels.at<char>(i, j) == 0) &&
(pixels.at<char>(i - 1, j) == 255) &&
(pixels.at<char>(i, j - 1) == 255) &&
(pixels.at<char>(i + 1, j) == 255) &&
(pixels.at<char>(i, j + 1) == 255)) {
pixels.at<char>(i, j) = 255;
}
}
}

它应该遍历我的图像并检查像素是否为黑色且他的邻域是否为白色。如果是这种情况,像素也应该变成白色像素。我在一张由这个 Mat 创建的测试图像上运行了这个:

Mat pixels = (Mat_<float>(5, 5) <<
255, 255, 255, 255, 255,
255, 0, 255, 0, 255,
255, 255, 255, 255, 255,
255, 0, 255, 0, 255,
255, 255, 255, 255, 255);

当我运行代码时什么也没发生,只出现了原始图像...

当我运行一个更简单版本的代码时,它起作用了,所以语法实际上应该是正确的:

    for (int i = 1; i < pixels.rows; ++i) {
for (int j = 1; j < pixels.cols; ++j) {
if ((pixels.at<char>(i, j) == 0)) {
pixels.at<char>(i, j) = 255;
}
}
}

有人发现我的错误吗?

最佳答案

该过程基本上是正确的,但是您正在创建一个 floatMat 并且您正在以 char 的形式访问它。您需要类型相同。

您的迭代范围也需要固定。您可能还需要检查 8 连接,否则中心像素设置为 0 的图像将无法按预期工作

还请记住,char 范围是 [-128, +127],因此它永远不会与 255 进行比较。

这是一个工作示例。我使用了 uchar,因为它是您在处理灰度图像时可能需要的类型:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;

int main()
{
Mat pixels = (Mat_<uchar>(5, 5) <<
255, 255, 255, 255, 255,
255, 0, 255, 0, 255,
255, 255, 255, 255, 255,
255, 0, 255, 0, 255,
255, 255, 255, 255, 255);

for (int i = 1; i < pixels.rows - 1; ++i) {
for (int j = 1; j < pixels.cols - 1; ++j)
{
if ((pixels.at<uchar>(i, j) == 0) &&
(pixels.at<uchar>(i - 1, j - 1) == 255) && // Top Left
(pixels.at<uchar>(i - 1, j + 0) == 255) && // Top
(pixels.at<uchar>(i - 1, j + 1) == 255) && // Top Right
(pixels.at<uchar>(i + 0, j - 1) == 255) && // Left
(pixels.at<uchar>(i + 0, j + 1) == 255) && // Right
(pixels.at<uchar>(i + 1, j - 1) == 255) && // Bottom Left
(pixels.at<uchar>(i + 1, j + 0) == 255) && // Bottom
(pixels.at<uchar>(i + 1, j + 1) == 255) // Bottom Right
)
{
pixels.at<uchar>(i, j) = 255;
}
}
}

std::cout << pixels;

return 0;
}

关于c++ - OpenCV/C++ - 编辑所有孤立的像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37397219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com