2014-11-20 4 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 

왜 이렇게 반전되지 않는지에 대한 아이디어가 있습니까? 도와 주셔서 감사합니다!

편집 : 일부 모듈에서는 더 많은 코드를 요청했습니다. 그런 다음

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 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 

: 원시 RGB 데이터에 걸립니다 만 빨간색 첫번째에 대한 필터링 컬러 필터가있다 는 그레이 스케일의 가치를 살펴보고 그 가치를 기반으로 바이너리로 변환 바이너리 이미지는 아래와 : 그것은 내가 원래 게시 된 반전 모듈로 이동

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

+0

나는 그것이 기술적으로 흑백 이미지라고 생각한다. 나는 빨간 색 빛을 찾기 위해 색상 필터링을하고, 그 다음 빨간색이면 255 색 (흰색)과 3 색색 채널을 0 (검정색)이 아닌 곳으로 설정합니다. – Mike

+0

입력은 순수한 흑백이 아닐 수도 있지만 회색 음영이있다. 예를 들어'binary_red'가 1 (검은 색 근처)이면'inverted_red'는 254 (흰색 근처)가 아닌 0 (검은 색)이됩니다. '~'연산자로 비트 반전을 시도하십시오 : ex'assign inverted_red = ~ binary_red;' – Greg

답변

1

입력 데이터는 순수한 흑백이 아니지만 회색 음영이 될 수 있습니다. 예를 들어 binary_red이 1 (검은 색 근처) 인 경우 inverted_red은 254 (흰색 근처)가 아니라 0 (검은 색)이됩니다.

~ 연산자로 비트 반전을 시도하십시오. 지금까지 도시

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, green 및 blue를 설정했습니다. 회색 값이 100 이상 (슈퍼 블랙이 아님)이면 0으로 설정하고 그렇지 않으면 255로 설정합니다. 따라서 모든 값이 0 또는 255가 될 것이라고 생각하십니까? – Mike

+0

@Mike : 잘못된 접근입니다. 가능한 모든 값 ('0-255')에 대해 작동하는 모듈을 작성해야하며 Greg 솔루션은이를 수행하는 좋은 방법입니다. – Qiu

+0

@ 그렉 : 나는 계속 나아가이 작업을 시도했지만 여전히 완전히 검은 색 화면을 가지고있다 (~ 연산자 사용). – Mike

관련 문제