如何在OpenCV中覆盖实际的GaussianBlur?

时间:2018-03-08 03:25:25

标签: opencv

我使用以下代码拍摄原始图像并将其模糊:

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
int main(int argc, char** argv) {
    cv::Mat img  = cv::imread("lenna_orig.png");
    cv::Mat gray, blurred;
    cv::cvtColor(img, gray, CV_BGR2GRAY);
    cv::GaussianBlur(gray, blurred, cv::Size(21, 21), 2.0);
    cv::imwrite("lenna_blur.png", blurred);
    return 0;
}

但有没有办法保存高斯模糊的实际图像?这样的事情?

cv::imwrite("gauss.png", cv::GaussianBlur(cv::Size(21, 21), 2.0));

我问,因为我最终想要进行反卷积问题,并将计算内核与实际的高斯内核进行比较,所以我需要知道实际的高斯内核究竟是什么样的

编辑:

如果我尝试

,我会看到
cv::Mat g = cv::getGaussianKernel(15, 2.0, CV_64F);
cv::imshow("g", g);
cv::imwrite("g.bmp", g);
根据文档,

这将无效,因为这会返回一个15x1矩阵作为内核。但我想要一个15x15内核

1 个答案:

答案 0 :(得分:2)

03-08 11:10:36.902 9886-9886/com.example.lenovo.trainapp E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.lenovo.trainapp, PID: 9886 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.lenovo.trainapp/com.example.lenovo.trainapp.Main3Activity}: android.os.NetworkOnMainThreadException at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273) at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110) at libcore.io.IoBridge.connectErrno(IoBridge.java:137) at libcore.io.IoBridge.connect(IoBridge.java:122) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:452) at java.net.Socket.connect(Socket.java:884) at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:124) at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:149) at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169) at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:366) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470) at com.example.lenovo.trainapp.Main3Activity.onCreate(Main3Activity.java:73) at android.app.Activity.performCreate(Activity.java:6237) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  at android.app.ActivityThread.-wrap11(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5417)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  返回1d高斯配置文件。由于内核是对称的,因此只需要计算1d曲线。

如果你想要一个2d版本,你可以堆叠15行的1d,然后将每列乘以相同的配置文件。

编辑:例如。假设高斯核为0.2,0.4,1.0,0.4,0.2(简化版本以减少打字)

创建方形数组,每行等于配置文件。

cv::getGaussianKernel

现在将每列乘以相同的配置文件

0.2 0.4 1.0 0.4 0.2 0.2 0.4 1.0 0.4 0.2 0.2 0.4 1.0 0.4 0.2 0.2 0.4 1.0 0.4 0.2 0.2 0.4 1.0 0.4 0.2

获得类似

的内容

0.2 0.4 1.0 0.4 0.2

仅使用实际的高斯曲线和15x15的结果。

ps这展示了这些内核的一个重要特性 - 它们是separable。这意味着您可以独立地在x和y方向上应用它们,然后将结果组合起来,这样可以更有效地使用它们。