【问题标题】:Enlarge image pixels with opencv用opencv放大图像像素
【发布时间】:2013-10-20 23:22:57
【问题描述】:
int main(int argc, char** argv){
cv::Mat gray;
cv::Mat resize;
cv::Mat big;
cv::cvtColor(src, gray, CV_BGR2GRAY);
cv::resize(gray, resize, cv::Size(src.rows/2, src.cols/2));
cv::resize(resize, big, cv::Size(src.rows, src.cols));
cv::Mat clone(resize.rows, resize.cols, CV_8U);

for(int y=0;y<resize.rows;y++){
       for(int x=0;x<resize.cols;x++){
           clone.at<uchar>(y,x) = resize.at<uchar>(y,x);

                               }
                                 }
            cv::imshow("clone", clone);

我写了我的代码,我有 2 个问题 1) 如何将 1 个像素放大为 4 个像素?并展示给他们看。 2)如何将图像的每个像素放大为 4 乘以图像的每个像素? (不使用插值)

编辑

从我的图像中,我想将 1 个像素放大为 4 个像素。 然后所有像素图像必须放大成更大的图像。

【问题讨论】:

    标签: c++ image opencv image-processing


    【解决方案1】:

    您需要使用最近邻“插值”:cv::INTER_NEAREST(或CV_INTER_NN)和cv::resize()

    cv::resize(gray, enlarged, cv::Size(gray.cols*2, gray.rows*2), cv::INTER_NEAREST);
    

    最近邻调整大小方案并不是真正的插值。它只是选择原始像素中最接近的像素。当放大 2 倍时,每个像素将被复制 4 倍,如您的绘图中所示。

    【讨论】:

    • 但我需要放大 1 个像素乘以 4 个像素,然后我使用命令 imshow。非常感谢。
    • cv::resize(灰色, 放大, cv::Size(gray.rows*2, gray.cols*2), cv::INTER_NEAREST);从这段代码中,它不会因为不使用插值而放大,还有其他方法吗?解决这个问题?我需要将 1 像素放大 4 像素,解决方法必须是图像不平滑。
    • 我不明白你的问题和你的问题。尝试提供更多细节和示例。
    • 答案是正确的。将一个像素“切割”成 4 个像素通常是通过复制它来完成的,技术术语实际上是最近邻插值。
    【解决方案2】:

    Adi Shavit 的回答在技术上是正确:您必须为您的任务使用最近邻插值

    然而,发生的不是像素变大,而是图像有更多像素。像素的大小是固定的(现在碰巧是不确定的):它真的只是用于显示图像的屏幕的一个光点。当你在屏幕上显示图像时,你会有一种感觉像素变大,因为最近邻插值只是简单地复制了原始像素。

    几年前,您可以假设像素大小(通常为 1/72 英寸),但视网膜屏幕确实在此处移动了线条。此外,一些面向任务的光栅图像格式(例如 Geotiff)允许将像素的物理尺寸(即其在地面上的足迹)作为元数据嵌入图像文件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-04
      • 2020-12-15
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多