2014-11-20 20 views
0

我有一個黑白圖像,我想反轉(黑色到白色和白色到黑色),其中黑色= 0和白色= 255。我試圖使用下面的代碼,而不是反轉我的圖像,它只是使整個屏幕變黑。試圖反轉二進制圖像給我全黑屏

module Inverter (
    input [7:0] binary_red, 
    input [7:0] binary_green, 
    input [7:0] binary_blue, 
    output [7:0] inverted_red, 
    output [7:0] inverted_green, 
    output [7:0] inverted_blue); 

    parameter black = 0; 
    parameter white = 255; 

    assign inverted_red = (binary_red == black) ? white : black; 
    assign inverted_green = (binary_green == black) ? white : black; 
    assign inverted_blue = (binary_blue == black) ? white : black; 
endmodule 

任何想法爲什麼這不像我想要的那樣顛倒?謝謝您的幫助!

編輯:所以有人要求看到更多的代碼,因爲它可能不是這個模塊,搞砸了。有一種彩色濾光器,它接受原始RGB數據並濾除僅紅色第一:

module Color_Filter (
    input  [9:0] oVGA_Red, 
    input  [9:0] oVGA_Green, 
    input [9:0] oVGA_Blue, 
    output [7:0] filtered_Red, 
    output [7:0] filtered_Green, 
    output [7:0] filtered_Blue); 

    parameter redFilterValue = 150; 
    parameter greenFilterValue = 110; 
    parameter blueFilterValue = 110; 

    assign filtered_Red = (oVGA_Red[9:2] >= redFilterValue && oVGA_Green[9:2] <= greenFilterValue && oVGA_Blue[9:2] <= blueFilterValue) ? oVGA_Red[9:2] : 0; 
    assign filtered_Green = (oVGA_Red[9:2] >= redFilterValue && oVGA_Green[9:2] <= greenFilterValue && oVGA_Blue[9:2] <= blueFilterValue) ? oVGA_Green[9:2] : 0; 
    assign filtered_Blue = (oVGA_Red[9:2] >= redFilterValue && oVGA_Green[9:2] <= greenFilterValue && oVGA_Blue[9:2] <= blueFilterValue) ? oVGA_Blue[9:2] : 0; 

endmodule 

此它被轉換後用下面的代碼爲灰度:

module Greyscale_Filter (
    input  [7:0] filtered_red, 
    input  [7:0] filtered_green, 
    input  [7:0] filtered_blue, 
    output [7:0] greyscale_red, 
    output [7:0] greyscale_green, 
    output [7:0] greyscale_blue); 

    assign greyscale_red = (filtered_red != 0) ? (299*filtered_red/1000)+(587*filtered_green/1000)+(114*filtered_blue/1000) : 0; 
    assign greyscale_green = (filtered_green != 0) ? (299*filtered_red/1000)+(587*filtered_green/1000)+(114*filtered_blue/1000) : 0; 
    assign greyscale_blue = (filtered_blue != 0) ? (299*filtered_red/1000)+(587*filtered_green/1000)+(114*filtered_blue/1000) : 0; 

endmodule 

然後,它前進到它着眼於灰度值,並轉換爲基於其價值二值圖像,如下圖所示:

module Binary_Filter (
    input [7:0] greyscale_red, 
    input  [7:0] greyscale_green, 
    input  [7:0] greyscale_blue, 
    output [7:0] binary_red, 
    output [7:0] binary_green, 
    output [7:0] binary_blue); 

    parameter black = 0; 
    parameter white = 255; 

    assign binary_red = ((greyscale_red > 51) ? white : black); 
    assign binary_green = ((greyscale_green > 51) ? white : black); 
    assign binary_blue = ((greyscale_blue > 51) ? white : black); 

endmodule 

在這之後它進入我最初發布的反轉模塊。在我的頂層模塊,這是通過做做:

Color_Filter color_filter (
            .oVGA_Red(oVGA_R), 
            .oVGA_Green(oVGA_G), 
            .oVGA_Blue(oVGA_B), 
            .filtered_Red(filtered_R), 
            .filtered_Green(filtered_G), 
            .filtered_Blue(filtered_B) 
            ); 

Greyscale_Filter greyscale_Filter (
              .filtered_red(filtered_R), 
              .filtered_green(filtered_G), 
              .filtered_blue(filtered_B), 
              .greyscale_red(greyscale_R), 
              .greyscale_blue(greyscale_G), 
              .greyscale_green(greyscale_B) 
              ); 

Binary_Filter binary_filter (
            .greyscale_red(greyscale_R), 
            .greyscale_green(greyscale_G), 
            .greyscale_blue(greyscale_B), 
            .binary_red(binary_R), 
            .binary_green(binary_G), 
            .binary_blue(binary_B) 
            ); 

Inverter inverter (
        .clk(VGA_CTRL_CLK), 
        .binary_red(binary_R), 
        .binary_green(binary_G), 
        .binary_blue(binary_B), 
        .inverted_red(inverted_R), 
        .inverted_green(inverted_G), 
        .inverted_blue(inverted_B) 
        ); 
+0

你真的有二進制圖像(每像素1位)或只是一個黑白圖像? – Qiu 2014-11-20 20:49:29

+0

我想這在技術上是黑白圖像。我會進行彩色濾鏡以找到紅光,然後在任何紅色的位置,我將三個顏色通道設置爲255(白色),而不是任何地方設置爲0(黑色) – Mike 2014-11-20 21:07:11

+0

您的輸入可能不是純黑色和白色,但有灰色陰影。例如,如果'binary_red'爲1(接近黑色),則'inverted_red'將爲0(黑色),而不是254(接近白色)。嘗試使用'〜'運算符進行反轉:ex'assign inverted_red =〜binary_red;' – Greg 2014-11-20 21:08:46

回答

1

輸入數據可能不是純黑色和白色,但有灰色陰影。例如,如果binary_red爲1(接近黑色),則inverted_red將爲0(黑色),而不是254(接近白色)。

嘗試使用~運算符反轉位。到目前爲止示出

assign inverted_red = ~binary_red; 
assign inverted_green = ~binary_green; 
assign inverted_blue = ~binary_blue; 

一切是用於單個像素,而不是整個陣列。任何人現在可以提供的最佳調試建議是讓您測試每個階段並找出問題。確保過濾器給出正確的輸出,然後是灰度過濾器,然後是二進制過濾器,最後是倒置過濾器。

也可以嘗試在仿真中運行,在放置FPGA之前可以看到波形中的所有內部信號。一個非常簡單的測試環境的例子:http://www.edaplayground.com/x/KqX

+0

我不確定。我先設置binary_red,綠色和藍色,首先拍攝灰度圖像並檢查每個像素的值。如果它的灰度值超過100(不是超級黑色),則將其設置爲0,否則將其設置爲255.因此,我認爲所有值都是0或255,對吧? – Mike 2014-11-21 02:31:11

+0

@Mike:這是錯誤的做法。你應該編寫一個適用於所有可能值('0-255')的模塊,Greg解決方案是一個很好的方法。 – Qiu 2014-11-21 09:55:46

+0

@Greg:我繼續嘗試這樣做,仍然有一個完全黑屏(使用〜運算符)。 – Mike 2014-11-21 15:40:31